1

我有以下问题:多线程 WPF 应用程序,模型视图演示器实现。Presenters 和 Views 属于一起在单独的线程上创建并获得单独的 Dispatcher。现在有人从另一个线程调用 Presenter 上的方法。我正在拦截呼叫,现在开始出现问题:如果呼叫来自与演示者相同的线程,我想继续呼叫,否则在 Dispatcherthread 上调用呼叫,这样我就不需要关心UI 调用。我已经阅读了有关 SynchronizationContext 的使用,但这似乎对我不起作用,因为如果调用线程不是 UI 线程,我无法比较这两个上下文。什么是可能的、有效的和优雅的解决方案?

4

2 回答 2

3
if( presenterDispatcherObject.CheckAccess() )
   Doit();
else
  presenterDispatcherObject.BeginInvoke( DispatcherPriority.Normal, () => DoIt() ); 
于 2008-12-04T15:23:28.800 回答
0

如果您希望 Dispatcher 调用阻塞(等待返回),我会使用 Invoke 而不是 BeginInvoke。这将模拟更多实际直接调用函数的行为。Invoke 阻塞调用线程,直到函数完成(更像是 Win32 SendMessage)。BeginInvoke 只是发布并返回而不等待函数返回(如 Win32 PostMessage)。

CheckAccess 很慢。我会通过减少不同线程上的调用来限制 CheckAccess。

public delegate bool MyFuncHandler(object arg);

bool ThreadedMyFunc(object arg)
{
    //...

    bool result;

    //...

    // use dispatcher passed in,  I would pass into the contructor of your class
    if (dispatcher.CheckAccess())
    {
        result = MyFunc(arg);
    }
    else
    {
        result = dispatcher.Invoke(new MyFuncHandler(MyFunc), arg);
    }

    return result;
}

bool MyFunc(object arg)
{
    //...
}
于 2008-12-05T02:36:40.187 回答