Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何将方法调用委托给另一个线程?_Wpf_Multithreading_Synchronization - Fatal编程技术网

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

Wpf 如何将方法调用委托给另一个线程?,wpf,multithreading,synchronization,Wpf,Multithreading,Synchronization,我有以下问题:多线程WPF应用程序、模型视图演示器实现。属于一起的演示者和视图在单独的线程上创建,并获得单独的调度程序。现在有人从另一个线程调用演示者上的方法。我正在拦截该调用,现在开始出现问题:如果该调用来自与演示者相同的线程,我希望继续该调用,否则在Dispatcherthread上调用该调用,这样我就不需要关心UI调用。 我已经读过SynchronizationContext的使用,但这似乎对我不起作用,因为如果调用线程不是UI线程,我就无法比较这两个上下文。什么是可行的、有效的、优雅的解

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

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

if( presenterDispatcherObject.CheckAccess() )
   Doit();
else
  presenterDispatcherObject.BeginInvoke( DispatcherPriority.Normal, () => DoIt() ); 
检查访问速度慢。我会限制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)
{
    //...
}