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

当我收到与线程上下文相关的exception时,我使用委托函数并调用此委托函数。 来自其他线程的使用控制是必要的。 但我刚学会了我可以使用SynchronizationContext.Post()函数,我可以在这个方法中调用我的委托。 但我不确定哪一个更好? 或者这些方法有什么区别。

非常感谢。

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

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

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

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

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

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

了解SynchronizationContext – 第一部分

了解SynchronizationContext – 第二部分

了解SynchronizationContext – 第三部分