我正在使用第三方工具,在其中我收到InvalidOperationException(实际上,最终会发生在PresentationFramework.dll中):
调用线程无法访问此对象,因为另一个线程拥有它。
我使用Invoke尝试了任何类型的变体,包括BeginInvoke,但没有任何变化。
Session session = new ThirdPartyTool.Session();
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,(Action)(()=> session.Open(view)));
使用Google时,我只找到建议使用Invoke的“解决方案”。好吧,我确实使用了Invoke 其他问题及其在stackoverflow上的相应答案也没有帮助。
为了追查实际原因,我还能做些什么?
编辑: 我再看一下线程窗口,完整的调用堆栈在主线程中。 AFAIK,这表明Invoke是多余的。
EDIT2:
调用open时不会直接引发错误。 ThirdPartyTool初始化一个列表框,在测量此列表框时,错误发生在表示框架中:
实际的异常被包装到XamlParseException中。完整的异常细节:
System.Windows.Markup.XamlParseException occurred
HResult=-2146233087
Message=The calling thread cannot access this object because a different thread owns it.
Source=PresentationFramework
LineNumber=0
LinePosition=0
StackTrace:
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=The calling thread cannot access this object because a different thread owns it.
Source=WindowsBase
StackTrace:
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Freezable.get_IsFrozen()
at System.Windows.Controls.Image.UpdateBaseUri(DependencyObject d, ImageSource source)
at System.Windows.Controls.Image.OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.FrameworkTemplate.ReceivePropertySet(Object targetObject, XamlMember member, Object value, DependencyObject templatedParent)
at System.Windows.FrameworkTemplate.<>c__DisplayClass6.<LoadOptimizedTemplateContent>b__4(Object sender, XamlSetValueEventArgs setArgs)
at System.Xaml.XamlObjectWriter.OnSetValue(Object eventSender, XamlMember member, Object value)
at System.Xaml.XamlObjectWriter.Logic_ApplyPropertyValue(ObjectWriterContext ctx, XamlMember prop, Object value, Boolean onParent)
at System.Xaml.XamlObjectWriter.Logic_DoAssignmentToParentProperty(ObjectWriterContext ctx)
at System.Xaml.XamlObjectWriter.Logic_AssignProvidedValue(ObjectWriterContext ctx)
at System.Xaml.XamlObjectWriter.WriteEndObject()
at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
InnerException: null
答案 0 :(得分:3)
我猜错了,并建议你不使用invoke:只需从你所在的地方拨打session.Open
。
我这样说是因为 - 如果你的session
对象具有线程关联性 - 你刚刚在当前线程上创建了它,因此Open
调用需要在同一个线程上。您的Invoke
可能会将呼叫推到其他位置。
或者,可能是某些其他代码导致了问题。如果是这种情况,那么您可以尝试使用创建对象,无论调度程序线程是什么:
Session session = null;
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
(Action)(() => {
session = new ThirdPartyTool.Session();
session.Open(view);
} ));
答案 1 :(得分:1)
事实证明,我的雷达屏幕上的图像导致了这个问题。一旦我们拨打Freeze
,问题就会消失。