0

到目前为止,就像很多这样的主题一样,我遇到一个问题,即这个异常发生在一个特定的地方(5% 的时间)和其他地方。

第一行代码是这样的

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

首先,我认为我可能需要将引用保留在一个字段中,但这也无济于事。

另一种情况是在一个未定义的地方,我什至在调用堆栈中都没有得到任何东西,所以我不能提供更多信息:(

至少有人对第一个有想法吗?

编辑:

当事情中断时调用堆栈

[管理到本地转换]  
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase obj, System.Windows.DependencyProperty 属性, 字符串) + 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, 对象值) + 0xd6 字节    
System.Windows.dll!System.Windows.DependencyObject.SetEffectiveValue(System.Windows.DependencyProperty 属性,参考 System.Windows.EffectiveValueEntry newEntry,对象 newValue)+ 0x35 字节
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyProperty 属性,System.Windows.EffectiveValueEntry oldEntry,参考 System.Windows.EffectiveValueEntry newEntry,System.Windows.DependencyObject.ValueOperation 操作)+ 0xe6 字节    
System.Windows.dll!System.Windows.DependencyObject.SetValueInternal(System.Windows.DependencyProperty dp, 对象值, 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,参考 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 callback, bool canDelay) + 0x47 bytes
System.Windows.dll!System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(object sender, 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, 字节 bIsParentAlive, 字节 bKeepReferenceToParent, bool canCreateParent) + 0xf8 字节   
[管理到本地转换]  
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement 元素,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 元素,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 中破坏非托管内存的方法,那就是在 Silverlight 5 中使用 P/Invoke。如果您这样做,您应该仔细查看代码的那部分。

问题中的演员阵容绝不是有害的。在最坏的情况下,丢失或错误的控件可能会触发 aNullReferenceException但不会破坏非托管内存。


如果您想改进转换(这不会解决您的问题),您可以使用扩展方法进行一些验证并告诉您是否存在问题:

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

好吧,首先,单行代码有很多 Casts。代码中的每种类型都意味着您比代码知道的更多,这很糟糕。Find 方法也有可能返回null

如果您尝试为表单设置 Numeric Spinner 的最小值,我建议您在表单内执行此操作 - 类似于以下内容。

DefinitionDetailForm.SetNumericSpinnerMinValue(0);

并且SetNumericSpinnerMinValue 可以具有通过适当的空检查为微调器设置最小值的逻辑。

try/catch在您怀疑异常上升的代码周围使用一个块。

再次 - 摆脱那些演员!

于 2012-04-27T08:00:28.417 回答