use invoke和synchronizationcontext.Post对象有什么区别?

时间:2014-02-14 11:24:26

标签: c# asynchronous thread-safety

当我收到与线程上下文相关的异常时,我使用委托函数并调用此委托函数。从其他线程使用控制是必要的。但我刚刚得知我可以使用SynchronizationContext.Post()函数,我可以用这种方法调用我的代理。 但我不确定哪一个更好?或者这些方法有什么区别。

非常感谢。

2 个答案:

答案 0 :(得分:10)

同样的事情,SynchronizationContext.Post()调用BeginInvoke()和Send()调用Invoke()。

SynchronizationContext的关键属性是它有多个实现。重要的是WindowsFormsSynchronizationContext,它使用Control.Begin / Invoke和DispatcherSynchronizationContext,它使用Dispatcher.Begin / Invoke。还有其他ASP.NET,Windows Store(又名WinRT,又名Universal)应用程序,COM +托管的进程外服务器等。

额外的间接级别有助于避免依赖于调用的特定方法。当然对任何类库都很重要。

答案 1 :(得分:2)

Control.Invoke相当于SynchronizationContext.Send,因为它们都是同步Control.BeginInvoke相当于SynchronizationContext.Post,因为它们都是异步。使用这4种方法中的任何一种来防止跨线程异常。

使用SynchronizationContext封装线程编组代码。例如,Form1创建对象Worker以在不同的线程上执行某些操作。 Worker的构造函数捕获当前(即Form1的)SynchronizationContext。当Worker生成要在Form1上显示的数据时,Worker可以在发送通知之前使用捕获的SynchronizationContext同步到Form1的线程,例如事件,到Form1。这意味着Form1不需要知道不同的线程,不需要调用InvokeRequired,并且代码更少。这也意味着Worker不需要知道它的客户端是Form。

下面是一个很好的系列解释SynchronizationContext

Understanding SynchronizationContext - Part I

Understanding SynchronizationContext - Part II

Understanding SynchronizationContext - Part III