0

これまでの多くのこのトピックと同様に、この例外が1つの特定の場所(5%の時間)および別の場所で発生するという問題があります。

コードの最初の行はこれです

 ((DefinitionDetailForm.FindNameInContent("DataFieldDefinitionPoints") as DataField).
                        FindName("DefinitionScoringPoints") as RadNumericUpDown).
                        Minimum = 0;

最初は、参照をフィールドに保持する必要があるかもしれないと思いましたが、これも役に立ちませんでした。

もう1つの状況は、コールスタックに何も取得されないため、これ以上情報を提供できない未定義の場所です:(

少なくとも最初のものについての考えを持っている人はいますか?

編集:

物事が壊れたときにスタックを呼び出す

[ネイティブ移行への管理]  
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase obj、System.Windows.DependencyPropertyプロパティ、文字列s)+0x6fバイト
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase doh、System.Windows.DependencyPropertyプロパティ、オブジェクトobj)+0x2ceバイト  
System.Windows.dll!System.Windows.DependencyObject.SetObjectValueToCore(System.Windows.DependencyProperty dp、object value)+0xd6バイト    
System.Windows.dll!System.Windows.DependencyObject.SetEffectiveValue(System.Windows.DependencyProperty property、ref System.Windows.EffectiveValueEntry newEntry、object newValue)+0x35バイト
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyPropertyプロパティ、System.Windows.EffectiveValueEntry oldEntry、ref System.Windows.EffectiveValueEntry newEntry、System.Windows.DependencyObject.ValueOperation操作)+0xe6バイト    
System.Windows.dll!System.Windows.DependencyObject.SetValueInternal(System.Windows.DependencyProperty dp、object value、bool allowReadOnlySet、bool isBindingInStyleSetter)+0x248バイト   
System.Windows.dll!System.Windows.Controls.TextBox.Text.set(文字列値)+0x33バイト  
Telerik.Windows.Controls.Input!Telerik.Windows.Controls.RadNumericUpDown.UpdateText()+0xa5バイト  
Telerik.Windows.Controls.Input!Telerik.Windows.Controls.RadNumericUpDown.OnValueChanged(Telerik.Windows.Controls.RadRangeBaseValueChangedEventArgs e)+0x1f5バイト
Telerik.Windows.Controls!Telerik.Windows.Controls.RadRangeBase.OnValueChanged(System.Windows.DependencyObject d、System.Windows.DependencyPropertyChangedEventArgs e)+0x105バイト
Telerik.Windows.Controls!Telerik.Windows.PropertyMetadata.PropertyChangeHook.OnPropertyChanged(System.Windows.DependencyObject d、System.Windows.DependencyPropertyChangedEventArgs e)+0x58bバイト    
System.Windows.dll!System.Windows.DependencyObject.RaisePropertyChangeNotifications(System.Windows.DependencyProperty dp、object oldValue、object newValue)+0x53バイト    
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyPropertyプロパティ、System.Windows.EffectiveValueEntry oldEntry、ref System.Windows.EffectiveValueEntry newEntry、System.Windows.DependencyObject.ValueOperation操作)+0xf3バイト    
System.Windows.dll!System.Windows.DependencyObject.RefreshExpression(System.Windows.DependencyProperty dp)+0x47バイト
System.Windows.dll!System.Windows.Data.BindingExpression.SendDataToTarget()+0xffバイト    
System.Windows.dll!System.Windows.Data.BindingExpression.SourceAcquired()+0x5fバイト  
System.Windows.dll!System.Windows.Data.Binding.EnsureBreakPoint(System.Windows.Data.Debugging.BindingDebugState debugState、System.Actionコールバック、bool canDelay)+0x47バイト
System.Windows.dll!System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(オブジェクト送信者、System.Windows.DataContextChangedEventArgs e)+0xa4バイト  
System.Windows.dll!System.Windows.Data.BindingExpression.DataContextChanged(object sender、System.Windows.DataContextChangedEventArgs e)+0xcバイト    
System.Windows.dll!System.Windows.FrameworkElement.OnDataContextChanged(System.Windows.DataContextChangedEventArgs e)+0x1eバイト  
System.Windows.dll!System.Windows.FrameworkElement.OnAncestorDataContextChanged(System.Windows.DataContextChangedEventArgs e)+0x26バイト  
System.Windows.dll!System.Windows.FrameworkElement.NotifyDataContextChanged(System.Windows.DataContextChangedEventArgs e)+0xcbバイト  
System.Windows.dll!System.Windows.FrameworkElement.OnTreeParentUpdated(System.Windows.DependencyObject newParent、bool bIsNewParentAlive)+0x3dバイト  
System.Windows.dll!System.Windows.DependencyObject.UpdateTreeParent(MS.Internal.IManagedPeer oldParent、MS.Internal.IManagedPeer newParent、bool bIsNewParentAlive、bool keepReferenceToParent)+0x4aバイト    
System.Windows.dll!MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate(System.IntPtr oldParentElement、System.IntPtr parentElement、System.IntPtr childElement、byte bIsParentAlive、byte bKeepReferenceToParent、bool canCreateParent)+0xf8バイト   
[ネイティブ移行への管理]  
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element、System.Windows.Size availableSize)+0x62バイト
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize)+0x18バイト  
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget、float inWidth、float inHeight、out float outWidth、out float outHeight)+0x9eバイト
[ネイティブ移行への管理]  
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element、System.Windows.Size availableSize)+0x62バイト
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize)+0x18バイト  
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget、float inWidth、float inHeight、out float outWidth、out float outHeight)+0x9eバイト
[Appdomainの移行]  
4

2 に答える 2

1

例外は、何かがアンマネージメモリを破損したことを示します。破損は、例外がスローされる前のある時点で発生することが多く、問題のトラブルシューティングが困難になります。スピナーはまったく関与していない可能性がありますが、アプリケーションのより不吉な問題のメッセンジャーにすぎません。

率直に言って、Silverlightでアンマネージメモリを破損する方法は1つしか考えられません。それは、Silverlight5でP/ Invokeを使用することです。その場合は、コードのその部分を注意深く確認する必要があります。

問題のキャストは決して有害ではありません。最悪の場合、制御が欠落しているか間違っていると、NullReferenceExceptionがトリガーされる可能性がありますが、アンマネージメモリが破損することはありません。


キャストを改善したい場合(問題は解決しません)、拡張メソッドを使用して検証を行い、問題があるかどうかを通知できます。

static class FrameworkElementExtensions {

  public T FindName<T>(this FrameworkElement parent, String name) {
    var child = parent.FindName(name);
    if (child == null)
      throw new ArgumentException(
        String.Format("No element named '{0}' exists.", name);
    var typedChild = child as T;
    if (typedChild == null)
      throw new ArgumentException(
        String.Format("Named element '{0}' has wrong type.", name);
    return typedChild;
  }

}

次に、次のように使用できます。

dataField.FindName<RadNumericUpDown>("DefinitionScoringPoints").Minimum = 0;

Telerik固有の呼び出しに対して同様の拡張メソッドを実装する必要があります。

于 2012-04-27T14:32:05.020 に答える
0

まず最初に、1行のコードに対して多くのキャストがあります。コードでキャストされるすべての型は、コードよりも多くのことを知っていることを意味しますが、これは悪いことです。また、Findメソッドが返す可能性もありますnull

フォームの数値スピナーの最小値を設定しようとしている場合は、フォーム内で設定することをお勧めします。

DefinitionDetailForm.SetNumericSpinnerMinValue(0);

また、SetNumericSpinnerMinValue 適切なnullチェックを使用してスピナーの最小値を設定するためのロジックを持つことができます。

try/catch例外が発生する可能性があると思われるコードの周囲にブロックを使用します。

もう一度-それらのキャストを取り除きます!

于 2012-04-27T08:00:28.417 に答える