Drar upp ett gammalt problem som jag ännu inte fått bukt på...
Jag har en Delegate som jag använder för att peka på två olika metoder. Jag skapar sedan två IAsyncResult.s som jag använder för att asynkront dra igång de olika metoderna.
Dim asyncProc1 As IAsyncResult
Dim asyncProc2 As IAsyncResult
Dim delProc1Ref As New delProc(AddressOf Proc1)
Dim delProc2Ref As New delProc(AddressOf Proc2)
asyncProc1 = delProc1Ref.BeginInvoke(New AsyncCallback(AddressOf Proc1CallBack), Nothing)
asyncProc2 = delProc2Ref.BeginInvoke(New AsyncCallback(AddressOf Proc2Callback), Nothing)
Jag använder även Callback-metoder. All denna koden funkar perfekt...
Problemet uppstår när jag försöker köra en WaitHandle:
Dim wh() As System.Threading.WaitHandle = {asyncProc1.AsyncWaitHandle, asyncProc2.AsyncWaitHandle}
System.Threading.WaitHandle.WaitAll(wh)
Jag får då fel-meddelandet:
"WaitAll for multiple handles on an STA thread is not supported."
Kör jag däremot istället:
System.Threading.WaitHandle.WaitAny(wh)
Då funkar det fint...jag kan alltså köra ovanstående kod 2 ggr efter vartannat för att få samma resultat...men det känns inte helt rätt...
Nån som har nån idé varför det inte fungerar? Körs .NET kod i STA-läge alltid, eller går det att ändra?
Hittade nåt liknande på msdn men fick inte det att funka...Har iaf löst det nu på ett annat sätt...
Jag var tvungen att skapa en ny tråd som drog igång den metoden där de asynkrona anropen skulle göras. Innan jag gjorde "start()" på tråden fick jag sätta:
"t.ApartmentState = Threading.ApartmentState.MTA" för att ange att den skulle köras som MTA.
Postar test-koden om nån råkar ut för liknande:
------- KLIENT -------------
Dim pObj As New ProcLogic()
Dim t As New Threading.Thread(AddressOf pObj.Go)
t.ApartmentState = Threading.ApartmentState.MTA
t.Start()
-------------- / KLIENT / -----------------
Public Class ProcLogic
Private Delegate Sub delProc()
Public Sub Go()
Dim asyncProc1 As IAsyncResult
Dim asyncProc2 As IAsyncResult
Dim delProc1Ref As New delProc(AddressOf proc1)
Dim delProc2Ref As New delProc(AddressOf proc2)
asyncProc1 = delProc1Ref.BeginInvoke(New AsyncCallback(AddressOf Proc1CallBack), Nothing)
asyncProc2 = delProc2Ref.BeginInvoke(New AsyncCallback(AddressOf Proc2CallBack), Nothing)
Dim wh() As System.Threading.WaitHandle = {asyncProc1.AsyncWaitHandle, asyncProc2.AsyncWaitHandle}
System.Threading.WaitHandle.WaitAll(wh)
Console.WriteLine("ALL DONE")
End Sub
Private Sub proc1()
System.Threading.Thread.Sleep(1000)
End Sub
Private Sub proc2()
System.Threading.Thread.Sleep(1500)
End Sub
Private Sub Proc1CallBack(ByVal ar As IAsyncResult)
Console.WriteLine("PROC 1")
End Sub
Private Sub Proc2CallBack(ByVal ar As IAsyncResult)
Console.WriteLine("PROC 2")
End Sub
End Class
258 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e