VB.NET 2010, .NET 4
Здравствуйте,
Недавно я прочитал об использовании объектов SynchronizationContext
для управления поток выполнения для некоторого кода. Я использовал универсальную подпрограмму для обработки (возможно) вызовов между потоками для таких вещей, как обновление элементов управления пользовательского интерфейса, которые используют Invoke
. Я любитель, и мне трудно понять плюсы и минусы любого конкретного подхода. Я ищу некоторое представление о том, какой подход может быть предпочтительнее и почему.
Обновление: этот вопрос частично мотивирован такими утверждениями, как следующее со страницы MSDN на Control.InvokeRequired
].
Еще лучшее решение - использовать
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