VB.NET 2010、.NET 4
Hello,
我最近读到有关使用SynchronizationContext
对象来控制某些代码的执行线程。我一直在使用通用子例程来处理(可能)跨线程调用,例如更新使用的 UI 控件Invoke
。我是一名业余爱好者,很难理解任何特定方法的优缺点。我正在寻找关于哪种方法更可取以及原因的一些见解。
更新:这个问题的部分原因是来自以下陈述:MSDN 页面上Control.InvokeRequired http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx.
更好的解决方案是使用SynchronizationContext
由返回SynchronizationContext
而不是一个
跨线程封送控制。
而且,当我环顾四周时,人们普遍感到困惑的是,为什么大多数关于此类问题的答案都表明Invoke
方法而不提及此方法。
方法一:
Public Sub InvokeControl(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
If Control.InvokeRequired Then
Control.Invoke(New Action(Of T, Action(Of T))(AddressOf InvokeControl), New Object() {Control, Action})
Else
Action(Control)
End If
End Sub
方法二:
Public Sub UIAction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of Control))
SyncContext.Send(New Threading.SendOrPostCallback(Sub() Action(Control)), Nothing)
End Sub
Where SyncContext
is a Threading.SynchronizationContext
我的 UI 表单的构造函数中定义的对象(我将其存储在模块中......不确定这是否是最佳选择):
Public Sub New()
InitializeComponent()
SyncContext = WindowsFormsSynchronizationContext.Current
End Sub
然后,如果我想更新一个控件(例如,Label1
)在 UI 表单上,我会这样做:
InvokeControl(Label1, Sub(x) x.Text = "hello")
or
UIAction(Label1, Sub(x) x.Text = "hello")
那么,大家觉得怎么样?是首选一种方式还是取决于上下文?如果您有时间,冗长将不胜感激!
提前致谢,
Brian