我的代码如下:
public override void Touch()
{
if ( System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess() )
{
TouchBase();
}
else
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Send,
(Action) (() => TouchBase()) );
}
}
我刚刚在if块(而不是else块)中崩溃了,因为必须在主线程上完成某些事情,并且调用堆栈清楚地表明这不是主线程,而是非托管IOCP线程。
所以我的问题是,从非托管线程或其他东西调用时,CheckAccess()是否不起作用?真的可以破碎吗?任何人都有任何想法在这里发生了什么。顺便说一句,这个问题很少发生,所以添加一些日志记录的建议并不是那么有用。
答案 0 :(得分:0)
似乎(我需要一段时间才能确定这一点)正确的做法是调用System.Windows.Application.Current.Dispatcher.CheckAccess()。如果没有设置,System.Windows.Dispatcher.CurrentDispatcher()会创建一个新的调度程序,当线程处于非托管状态时似乎就是这种情况。
答案 1 :(得分:0)
System.Windows.Threading.Dispatcher.CurrentDispatcher为您提供当前正在执行的线程的Dispatcher,而不是应用程序调度程序所在的线程。每个线程都有一个调度程序 - 但这不是您正在寻找的调度程序。
System.Windows.Application.Current.Dispatcher是应用程序的主要调度程序。如果你在两个地方都使用它,你应该没事。