0

我的代码如下:

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

4

2 回答 2

0

似乎(我需要一段时间才能确定这一点)正确的做法是调用 System.Windows.Application.Current.Dispatcher.CheckAccess() 。System.Windows.Dispatcher.CurrentDispatcher() 如果未设置,则会创建一个新的调度程序,这似乎是线程不受管理的情况。

于 2012-11-23T04:20:45.123 回答
0

System.Windows.Threading.Dispatcher.CurrentDispatcher 为您提供当前执行线程的调度程序,而不是应用程序调度程序所在的线程。每个线程都有一个调度程序——但这不是您要查找的调度程序。

System.Windows.Application.Current.Dispatcher 是应用程序的主要调度程序。如果你在这两个地方都使用它,你应该没问题。

于 2015-07-29T17:00:28.330 回答