Hej Flashback, bara för att fylla i lite. Jaha, det va ett bra förklaring. du har hört precis fel, Långa operationer som lever lika länge som applikationen ska exekveras på en egen tråd som du skapar via Thread klassen annars ska du använda trådpoolen. (asynka delegater använder trådpoolen)Asykrona metoder
Jag har hört att man inte ska använda trådar ifall tråden måste leva en längre tid.
Jag vill utföra ett par (säg tre) ganska så tunga operationer parallellt och utanför
huvudtråden. Som jag förstår kan jag använda delegater. Men hur gör jag dessa
asykrona så att jag kan dra igång 3 st likvärdiga metoder och ändå kunna fortsätta
exekuvera koden. Sedan vill jag förstås ha en delegat/händelse som triggas när
en av dessa delegater är klara med sitt resultat.
Helst vill jag att huvudtråden ska kunna hämta status (vart i exekveringen) dessa
tre delegater befinner sig.
Hur är detta möjligt? Hur bör man göra. Jag skriver i vb.
Tack för hjälpen
Hälsningar
MarcusSv: Asykrona metoder
har vi inte sett den här tråden förut?
Alla delegater har en BeginInvoke metod som startar en asykronoperation istället för en synkron. Till BeginInvoke så kan du skicka med en delegat som talar om vart den skall ropa när den är klar.
För status så skulle jag kommunicerat med events när statusen ändras.
Däremot ställer jag mig frågande till "Jag har hört att man inte ska använda trådar ifall tråden måste leva en längre tid".
Trådar är definitivt att föredra om operationen pågår en längre tid. De är enklare att påverka och hantera om operationen måste avbrytas. Däremot om de skall pågå en kortare tid, då är tex threadpool eller asynkrona delegater att föredra.Sv: Asykrona metoder
när du gör ett asyncront anrop med begininvoke så är det en vanlig tråd med IsBackground=true och IsThreadPoolThread=true som sköter anropet.
så det är ju i princip hugget som stucket...
//RogerSv: Asykrona metoder
Jag får se vad jag använder mig av.
Jag har nu åtminstonde lyckats knåpa ihop en asynkron delegate. Här
är ett exempel för den som vill ha.
Tack
MarcusC
<code>
Imports System.Runtime.Remoting.Messaging ‘Import this namespace
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Declare my class where the delegate located
Dim w As New Worker
'Declare an asyncallback variable as AsyncCallback
Dim asyncallback As AsyncCallback
'Set the asyncallback variable to new instance of AsyncCallback addressed to the CallbackMethod
asyncallback = New AsyncCallback(AddressOf MyCallback)
'Create variable as delegateobject, address/point of the worker funktion
Dim workerBalanceDelegate As New Worker.myBalance(AddressOf w.Caculate)
'Begin Invoke the declared delegated variable, pass asyncallback veriable how hold the callback function to the delegate
workerBalanceDelegate.BeginInvoke(asyncallback, 0)
End Sub
'CALLBACK Method. Must be a Sub. Signature as IAsyncResult
Sub MyCallback(ByVal result As IAsyncResult)
'Declare verible as AsyncResult object
Dim ar As AsyncResult
'Set the passing result param to the declared ar using ctype
ar = CType(result, AsyncResult)
'Create variable as the delegate funktion. Use the created AsyncResult variables AsyncDelegate function, and using ctype.
Dim balanse As Worker.myBalance = CType(ar.AsyncDelegate, Worker.myBalance)
'Call the EndInoke of the lokal created delegate. pass the AsyncResult (ar) param.
MessageBox.Show(balanse.EndInvoke(ar))
End Sub
End Class
Class Worker
'The delegate
Public Delegate Function myBalance() As Date
‘THE delegate worker funktion. Same type and signature as the delegate
Function Caculate() As Date
Threading.Thread.Sleep(5000)
Return Now
End Function
End Class
</code>Sv: Asykrona metoder