Hi,
Du kannst das erreichen, indem Du einen Event mit Custom Event implementierst.
Beispiel (ich hoffe das geht so auch mit Compact Framework, hab's nur in normaler WinForms-App getestet):
Imports System.ComponentModel
Public Class Worker
Public Sub WorkAsync()
'Statt eines WebRequests
Dim t As New System.Threading.ThreadStart(AddressOf Work)
t.BeginInvoke(AddressOf WorkCallback, Nothing)
End Sub
Public Sub Work()
Debug.WriteLine("Starting Work")
System.Threading.Thread.Sleep(2000)
Debug.WriteLine("Work done")
End Sub
Private Sub WorkCallback(ByVal ar As IAsyncResult)
OnWorkCompleted(EventArgs.Empty)
End Sub
Protected Overridable Sub OnWorkCompleted(ByVal e As EventArgs)
RaiseEvent WorkCompleted(Me, e)
End Sub
Private _workCompletedHandlers As New List(Of EventHandler)
Public Custom Event WorkCompleted As EventHandler
AddHandler(ByVal value As EventHandler)
SyncLock Me
_workCompletedHandlers.Add(value)
End SyncLock
End AddHandler
RemoveHandler(ByVal value As EventHandler)
SyncLock Me
_workCompletedHandlers.Remove(value)
End SyncLock
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
'Kopie der angefügten Eventhandler holen
Dim handlers As EventHandler()
SyncLock Me
handlers = _workCompletedHandlers.ToArray()
End SyncLock
'Durch Handler iterieren
For Each handler As EventHandler In handlers
'Versuchen, das Zielobjekt als ISynchronizeInvoke zu holen
'(WinForms-Controls implentieren ISynchronizeInvoke)
Dim isyncInvoke As ISynchronizeInvoke = TryCast(handler.Target, _
ISynchronizeInvoke)
If isyncInvoke IsNot Nothing AndAlso isyncInvoke.InvokeRequired Then
Try
'Handler indirekt über ISynchronizeInvoke abarbeiten
isyncInvoke.BeginInvoke(handler, New Object() {sender, e})
Catch ex As Exception
'Immer Catch, da man nicht sicherstellen kann,
'dass das Taget-Objekt noch nicht disposed wurde.
End Try
Else
'Handler direkt aufrufen
handler(sender, e)
End If
Next
End RaiseEvent
End Event
End Classund Die Form dazuPublic Class Form1
Private WithEvents _client As New Worker
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Debug.WriteLine("WinFormsThread = " & _
System.Threading.Thread.CurrentThread.GetHashCode())
AddHandler _client.WorkCompleted, AddressOf TestTarget.Client_WorkCompleted
_client.WorkAsync()
End Sub
Private Sub _client_WorkCompleted(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles _client.WorkCompleted
Debug.WriteLine("WinForm WorkCompleted auf Thread " & _
System.Threading.Thread.CurrentThread.GetHashCode())
Me.TextBox1.Text = Now.ToString()
End Sub
Private Class TestTarget
Public Shared Sub Client_WorkCompleted(ByVal sender As Object, ByVal e As _
System.EventArgs)
Debug.WriteLine("TestTarget WorkCompleted auf Thread " & _
System.Threading.Thread.CurrentThread.GetHashCode())
RemoveHandler CType(sender, Worker).WorkCompleted, AddressOf _
Client_WorkCompleted
End Sub
End Class
End ClassCiao
D. |