与迄今为止的许多主题一样,我遇到了一个问题,即此异常发生在一个特定的地方(5%的时间)和其他地方。
第一行代码是这个
((DefinitionDetailForm.FindNameInContent("DataFieldDefinitionPoints") as DataField).
FindName("DefinitionScoringPoints") as RadNumericUpDown).
Minimum = 0;
起初,我想我可能需要把参考资料保存在一个字段中,但这也没有帮助。
另一种情况是在一个未定义的地方,我甚至在调用堆栈中没有得到任何信息,因此我无法提供更多信息:(
有人至少对第一个有想法吗?
编辑:
当东西破坏时调用堆栈
[托管到本机转换]System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase对象,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.DdependencyProperty-dp,对象值)+0xd6字节System.Windows.dll!System.Windows.DependencyObject.SetEffectiveValue(System.Windows.DdependencyProperty属性,引用System.Windows.EffectiveValueEntry newEntry,object newValue)+0x35字节System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DendencyProperty属性、System.Windows.EffectiveValueEntry oldEntry、引用System.Windows.EeffectiveValueEntry newEntry、System.Windows.DdependencyObject.ValueOperation操作)+0xe6字节System.Windows.dll!System.Windows.DependencyObject.SetValueInternal(System.Windows.DdependencyProperty-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.Window.Controls.RadRangeBaseValueChangedEventArgs e)+0x1f5字节Telerik.Windows.Controls!Telerik.Windows.Controls.RadRangeBase.OnValueChanged(System.Windows.DependencyObject d,System.Windows.DdependencyProperty ChangedEventArgs e)+0x105字节Telerik.Windows.Controls!Telerik.Windows.PropertyMetadata.PropertyChangeHook.OnPropertyChanged(System.Windows.DependencyObject d,System.Windows.DendencyPropertyChangedEventArgs e)+0x58b字节System.Windows.dll!System.Windows.DependencyObject.RisePropertyChangeNotifications(System.Windows.DdependencyProperty dp、对象oldValue、对象newValue)+0x53字节System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DendencyProperty属性、System.Windows.EffectiveValueEntry oldEntry、引用System.Windows.EeffectiveValueEntry newEntry、System.Windows.DdependencyObject.ValueOperation操作)+0xf3字节System.Windows.dll!System.Windows.DependencyObject.RefreshExpression(System.Windows.DdependencyProperty-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.DData.Debugging.BindingDebugState-debugState,System.Action回调,bool canDelay)+0x47字节System.Windows.dll!System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(对象发送方,System.Windows.Data ContextChangedEventArgs e)+0x4字节System.Windows.dll!System.Windows.Data.BindingExpression.DataContextChanged(对象发送方,System.Windows.DDataContextChangedEventArgs e)+0xc字节System.Windows.dll!System.Windows.FrameworkElement.OnDataContextChanged(System.Windows.DataContextChangedEventArgs e)+0x1e字节System.Windows.dll!System.Windows.FrameworkElement.OnAcestorDataContextChanged(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旧Parent,MS.Internal-IManagedPeer新Parent,bool bIsNewParentAlive,bool keepReferenceToParent)+0x4a字节System.Windows.dll!MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate(System.IntPtr oldParentElement、System.IntPtr-parentElement、System.IntPtr childElement、字节bIsParentLive、字节bKeepReferenceToParent、布尔canCreateParent)+0xf8字节[托管到本机的转换]System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement元素,System.Windows.Size available Size)+0x62字节System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size available Size)+0x18字节System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget、float inWidth、float in Height、out float outWidth、out floating outHeight)+0x9e字节[托管到本机的转换]System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement元素,System.Windows.Size available Size)+0x62字节System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size available Size)+0x18字节System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget、float inWidth、float in Height、out float outWidth、out floating outHeight)+0x9e字节[Appdomain Transition]
异常表示有东西损坏了非托管内存。损坏通常发生在抛出异常之前的某个时间点,因此很难解决问题。微调器可能根本不涉及,而只是应用程序中更险恶问题的信使。
坦率地说,我只能想出一种方法来破坏Silverlight中的非托管内存,那就是在Silverlight 5中使用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特定的调用实现类似的扩展方法。
首先,一行代码需要大量Cast。代码中的每一种类型转换都意味着你知道的比代码多得多,这很糟糕。Find方法也有可能返回null
如果你试图为窗体设置数值微调器的最小值,我建议你在窗体内部进行设置——沿着的行。
DefinitionDetailForm.SetNumericSpinnerMinValue(0);
SetNumericSpinnerMinValue
可以具有设置微调器最小值的逻辑,并进行适当的空检查。
在您怀疑会出现异常的代码周围使用try/catch
块。
再次-去掉那些石膏!