Satt och funderade på en sak igår. Har för mig att det är synchronizationcontext på den tråden som startar jobbet. Hej Petter, Kör du den här koden ser du att callbacken sker på worker-tråden, inte tråden som startar jobbet.i vilken tråd körs CallBack när man anväder AsynCallback
Vilken tråd är det som Callbacken körs i när man t.ex. läser in en fil asyncront?
Kör callback i tråden som läste in filen eller körs den i tråden som skapade tråden att som läser in filen.
dvs
vi har en console app som kör en BeginRead ....
Då startar vi ju en ny tråd som läser in nånting.
När vi anropade BeginRead skickar vi med en Callback delegat som pekar på t.ex. ReadComplete.
Alltså min fråga är kommer ReadComplete att köras av tråden vi skapade med BeginRead eller kommer det att köras av huvudtråden
Hoppsa ni förstår vad jag menar ;)
//PeterSv: i vilken tråd körs CallBack när man anväder AsynCallback
Detta innebär att om du t.ex. startar jobbet från en GUI tråd så kommer callback att anropas i samma GUI tråd. I trådar som saknar synchronizationcontext anväds en tråd från threadpool.Sv: i vilken tråd körs CallBack när man anväder AsynCallback
Enklast för dig att se vilken tråd gör dett är att skriva ut info om din nuvarande tråd. Då kan du se skilnaderna.
Hursomhelst. I.o.m. att BeginRead returnerar i princip direct, detta betyder att det är inte BeginRead tråden som kommer att köra din callback. Det kommer inte heller att vara din huvudtråd. Det kommer att vara en tråd från en speciell trådpool.
Jag hoppas att detta hjälper.
Mvh,
TibiSv:i vilken tråd körs CallBack när man anväder AsynCallback
Console.WriteLine("Calling on thread {0}", Thread.CurrentThread.GetHashCode());
FileStream fs =
new FileStream(@"C:\nisse.txt", FileMode.Open);
fs.BeginRead(buffer, 0, buffer.Length,
res => Console.WriteLine("Callback on thread {0}", Thread.CurrentThread.GetHashCode()), null);
Du kan använda synchronizationContext för att få callback till main-tråden men då får du koda en del själv, som i detta exempel: http://www.codeproject.com/KB/cpp/SyncContextTutorial.aspx
Kom också ihåg att du ska anropa EndRead i callbacken. Det anropet tar en hel del tid, och gör du det i callbacken tappar du ju vinsten med att göra anropet asynkront eller hur?
Men enklast är ju att att använda Invoke, eller dispatcher.Invoke om du är en WPF-guy!