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