Pozwólcie, że się podepnę do tematu. Chciałem zapytać co myślicie o rozwiązaniu tego typu (kod w VB.NET ale chyba wszyscy będą wiedzieć o co chodzi):
Friend WithEvents Watki As WatkiClass = New WatkiClass()
Friend Delegate Sub RefreshUI_Callback(ByVal Wytyczna As String, ByVal Dane As Object)
Private Sub RefreshUI(ByVal Wytyczna As String, ByVal Dane As Object) Handles Watki.RefreshUI
Try
If Me.InvokeRequired AndAlso Not Me.Disposing AndAlso Not Me.IsDisposed Then
Dim d As New RefreshUI_Callback(RefreshUI_Do)
Me.Invoke(d, New Object() {Wytyczna, Dane})
ElseIf Not Me.Disposing AndAlso Not Me.IsDisposed Then
RefreshUI_Do(Wytyczna, Dane)
End If
Catch ex As Exception
End Try
End Sub
Private Sub RefreshUI_Do(ByVal Wytyczna As String, ByVal Dane As Object)
Select Case Wytyczna
Case Is = "AddItem"
'Jakiś kod...
Case Is = "ClearItem"
'Jakiś kod...
Case Else
End Select
End Sub
Jest klasa np. WatkiClass z której uruchamiane są nowe wątki, zawiera deklarację:
Friend Event RefreshUI(ByVal Wytyczna As String, ByVal Dane As Object)
Potem do aktualizacji interfejsu z poziomu dowolnego wątku tej klasy wystarczy wywołać:
RaiseEvent RefreshUI("AddItem", "cokolwiek")
Chodzi o to, że w sumie nie trzeba pisać nowych kawałków kodu dla każdego nowego zdarzenia na formularzu. Teoretycznie jeśli Me.InvokeRequired = True to dla każdej kontrolki potomnej zawartej na tym formularzu też Invoke będzie wymagane. Prosiłbym o opinię na temat tego rozwiązania i wskazanie ewentualnych przeciwwskazań do jego stosowania. Jak na razie w moich projektach się sprawdza. ;)