Dispatcher.CheckAccess从非托管工作线程返回true

时间:2012-11-22 04:50:44

标签: c# .net multithreading unmanaged

我的代码如下:

   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()是否不起作用?真的可以破碎吗?任何人都有任何想法在这里发生了什么。顺便说一句,这个问题很少发生,所以添加一些日志记录的建议并不是那么有用。

2 个答案:

答案 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是应用程序的主要调度程序。如果你在两个地方都使用它,你应该没事。