VB.NET Два разных подхода к универсальным многопоточным операциям; что лучше?

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

5
задан Brian Mulcahy 16 February 2011 в 00:43
поделиться