如何将方法调用委托给另一个线程?

时间:2008-12-04 14:39:46

标签: wpf multithreading synchronization

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

2 个答案:

答案 0 :(得分:3)

if( presenterDispatcherObject.CheckAccess() )
   Doit();
else
  presenterDispatcherObject.BeginInvoke( DispatcherPriority.Normal, () => DoIt() ); 

答案 1 :(得分:0)

如果你想让Dispatcher调用阻塞(等待返回),我会使用Invoke而不是BeginInvoke。这将模仿更多直接实际调用函数的行为。调用块调用线程直到函数被finshed(更像是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)
{
    //...
}