【问题标题】:What are difference between using Invoke and SynchronizationContext.Post object?使用 Invoke 和 SynchronizationContext.Post 对象有什么区别?
【发布时间】:2014-02-14 11:24:25
【问题描述】:

当我收到与线程上下文相关的异常时,我使用委托函数并调用此委托函数。有必要使用来自其他线程的控制。但是我刚刚了解到我可以使用SynchronizationContext.Post() 函数,并且可以在此方法中调用我的委托。

我不确定哪个更好?这些方法有什么区别?

【问题讨论】:

  • 你是使用委托的Invoke方法还是使用Control.Invoke方法调用委托?
  • 您应该将SynchronizationContext.PostControl.BeginInvokeSynchronizationContext.SendControl.Invoke 进行比较。 WinFormsSynchronizationContext 在内部调用 Control.BeginInvoke
  • 是的,我可以比较这些,但我想知道理论上的区别

标签: c# asynchronous thread-safety


【解决方案1】:

同理,SynchronizationContext.Post() 调用 BeginInvoke(),Send() 调用 Invoke()。

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

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2013-02-05
      • 2011-09-23
      • 2013-06-26
      • 2011-07-31
      相关资源
      最近更新 更多