VB.NET 2010, .NET 4
Здравствуйте,
Я недавно читал об использовании SynchronizationContext
объектов для управления потоком выполнения для некоторого кода. Я использовал общую подпрограмму для обработки (возможно) межпоточных вызовов для таких вещей, как обновление элементов управления пользовательского интерфейса, которые используют Invoke
. Я любитель, и мне трудно понять плюсы и минусы любого конкретного подхода. Я ищу понимание того, какой подход может быть предпочтительным и почему.
Обновление: Этот вопрос частично мотивирован такими утверждениями, как следующие со страницы MSDN на Control.InvokeRequired
.
Еще лучшим решением является использование
SynchronizationContext
возвращено
SynchronizationContext
, а не
управление маршалингом с поперечной резьбой.
А также общее заблуждение относительно того, почему, когда я оглядываюсь вокруг, большинство ответов на вопросы, касающиеся проблемы такого типа в SO, предлагают подход Invoke
без упоминания этого метода.
Метод 1:
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
Метод 2:
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
Где SyncContext
- это Threading.SynchronizationContext
объект, определенный в конструкторе моей формы пользовательского интерфейса (я храню его в модуле ... Не уверен, что это лучший выбор):
Public Sub New()
InitializeComponent()
SyncContext = WindowsFormsSynchronizationContext.Current
End Sub
Затем, если бы я хотел обновить элемент управления (например, Label1
) в форме пользовательского интерфейса, я бы сделал:
InvokeControl(Label1, Sub(x) x.Text = "hello")
или
UIAction(Label1, Sub(x) x.Text = "hello")
Итак, что вы думаете? Является ли один способ предпочтительным или зависит от контекста? Если у вас есть время, мы будем благодарны за многословие!
Заранее спасибо,
Brian