我应该使用Invoke或SynchronizationContext来更新另一个线程的表单控件吗?

Joh*_*ith 5 c# multithreading invoke

试图从其他线程更新UI控件.

目前正在使用BeginInvoke,老实说它工作正常,但我一直听说你如何使用SynchronizationContext来做同样的事情.

哪个更受欢迎?

另外,从线程更新UI是不好的做法吗?提出一个事件并让主要表单处理它或者还有其他更好的方法来处理它会更好吗?

对不起,我有些主观的问题,但在线程的世界这么多的选择,我试图抓住他们的分歧,每个人都适用,与写可读和可扩展的代码对未来的最佳实务.

编辑:现在我也看到了TaskScheduler.FromCurrentSynchronizationContext路线也是如此..有很多选择x_x

Jar*_*Par 6

我喜欢SynchronizationContextControl.Invoke.存在的危险Control.Invoke是拥有产品存在终身问题Control.如果控件在您尝试使用时Invoke处理,则会影响调用成功的能力.当对话框关闭,视图移动等时会发生这种情况......

SynchronizationContext.Current虽然通常与它所关联的线程一样长寿.它确实具有有限的寿命,因此最终存在相同的问题,但它比a更可预测Control.

  • 我不认为这句话是正确的"如果在你试图调用它时控制被丢弃那么它会影响调用成功的能力......"因为实际上WindowsFormsSynchronizationContext是SynchronizationContext的具体impl,使用正好用Control.Invoke做编组`Control control = this.controlToSendTo; object [] objArray = new object [] {state}; control.Invoke(d,objArray);`,我想我更喜欢SynchronizationContext,因为它是一个抽象,如果微软改变了具体的实现,你就不必更改你的代码了 (3认同)