Wpis z mikrobloga

#csharp #programowanie

Mirki mam pewien problem z asyncami, bo osobiście nigdy ich nie używałem w ten sposób (robiłem jawnego Taska jak już, i zwykle raczej fire and forget, więc nie musiałem tego synchronizować).

Mam sobie rzecz którą próbuję przerobić na asynchroniczną wersję w ramach testu czy będzie szybciej czy wolniej, ale coś chyba nie do końca ogarniam temat, bo zdaje się, że robi mi się deadlock i nie wiem czemu.

Mam zwieszkę na Task.WaitAll. Co jest nie tak? Bebechów nawet macie po co analizować - synchronicznie to na pewno wszystko dobrze działa, nawet jeśli dało się to ładniej napisać xD

https://pastebin.com/7dy7fWhq
  • 21
  • Odpowiedz
@kuite22: Swoją drogą jak czytam ten temat na stacku to nadal nie wiem czemu u mnie to nie zadziałało. Koleś to trochę dziwnie zrobił, bo on miał funkcję async na której jeszcze w dodatku robił start new, więc task w tasku jakby.

Jak wejdę sobie do tej listy tasków w momencie dojścia do WaitAll, to taski są jeszcze nierozpoczęte. Jak dojdzie do linii WaitAll, to ewidentnie wszystkie te taski się
  • Odpowiedz
@kuite22:

Task.WaitAll(Task.WhenAll(tasks.ToArray()));

Takie coś też nie działa. WhenAll tworzy taska, który się zakończy jak zakończą się rzeczy które są do niego przypisane. Ten górny task widać też nie łapie.

Chyba trzeba na Stacku się zapytać.
  • Odpowiedz
@kuite22: Ale to nic nie da, bo on utworzy taska który trzeba awaitować. A nie mogę go awaitować, bo Execute nie jest asynciem. Więc aby go awaitować w funkcji nie będącej asynciem muszę nadal użyć WaitAll.
  • Odpowiedz
@kuite22: Cóż, znalazłem jeszcze kilka sposobów aby to zrównoleglić aby działało, ale nadal nie wiadomo czemu owrappowanie funkcji synchronicznej przez Task.Run wewnątrz funkcji async daje taki smutny efekt.

Działa w momencie gdy zrobię prymitywnego asynca na samym ReadImages i wtedy odpalam go bezpośrednio do tej listy (bez pośrednika w postaci Task.Run). Ot dałem na końcu await Task.CompletedTask; i działa. Działa także zmiana zwykłego foreacha na asynchroniczny:

Parallel.ForEach(parsedTags, currentTag => ReadImages(currentTag));
  • Odpowiedz