Asynchroniczność a taski

0

Cześć mam taki kod przykładowo:

 Task t3 = Task.Run(() =>
                {
                Thread.Sleep(2000);
                Console.WriteLine("Call from task t3.");
               });

To zadanie wykona się - wiadomo - w tle. Ale czy asynchronicznie? Jeśli tak, to jaki jest zatem sens stosowania async i await?
Z dokumentacji msdn:

Task Class - Represents an asynchronous operation.

To dość mylące, prawda?
Ten kod można również napisać tak:

Task t2 = Task.Run(async () =>
            {
                await Task.Delay(4000);
                Console.WriteLine("Call from task t2.");

            });

Wtedy już jest asynchronicznie ponieważ stosuję tutaj await w celu "wydłużenia" pracy metody.

0

async i await to tylko syntax sugar, czyli ładnie opakowane wątki
nie było tego w ogóle przed .NET 4.5

0

Ale z czym dokladnie masz problemy? Slowo kluczowe async mowi tylko tyle, ze dana metoda bedzie wykonana asynchronicznie, natomiast wystartowanie Task'a to utworzenie nowego watku.
Korzysci z await/async sa takie ze tworzysz metody, ktore wyglada jak zwykle metody, a sa wykonywane asynchronicznie.
W drugim przypadku i tak odpalasz metode asynchroniczna w osobnym watku, wiec nie zauwazysz korzysci ze stosowania await.

0

@Chdzk No właśnie o to mi chodzi :).
Task.Run ew. Task.Factory.StartNew to nowy wątek (tak?) a oznaczenie metody tudzież Taska async&await wykonuje operacyjne asynchroniczne.
A wiemy , że asynchroniczność niekoniecznie tworzy nowy wątek (mam rację?).

1

Asynchronicznosc niekoniecznie tworzy nowy watek, zgadza sie - wykonuje sie wtedy na watku IOCP.

0

@Chdzk
A klasa Task lub Task<T> tworzy nowy wątek tak?
To dlaczego na MSDN jest zaznaczone, że działa asynchronicznie?

0

bo wątki z definicji działają asynchronicznie

0

Generalnie tak jak @Chdzk napisał, async nie zawsze tworzy nowy wątek. Tworzenie taska samo w sobie jest synchroniczne. Przykład, asynchroniczności:

  • zapisujesz dużo danych do pliku: "mówisz" systemowi operacyjnemu co ma zapisać w trakcie tworzenia taska, i mówisz mu, że ma Ci dać znać jak skończysz, (tak mniej więcej działa fstream)
  • ten sam przykład co wyżej tylko w sieci,
  • generalnie wszystko co jest wspierane przez OS asynchronicznie
1

To czy async czy Task (jeden pies) tworzy wątek czy nie zależy całkowicie od bieżącego „synchronization context”.
Można nawet oprogramować samemu, jak mają być realizowane taski.

W efekcie inaczej Task się zachowuje w aplikacji konsolowej, inaczej w Windows Forms, WPF, inaczej w Windows Store.

W typowej aplikacji, Task.Run dodaje taska do ThreadPool, kolekcji wątków przeznaczonych na odpalanie tasków. (więc nie tworzony jest nowy wątek, ale wykorzystywany jeden z istniejących do tego celu wątków w tle)

Samo słowo kluczowe async jest tylko cukrem składniowym ułatwiającym pisanie kodu z taskami, na tej samej zasadzie co yield ułatwia tworzenie enumeratorów.

bfdbcvxgdssad napisał(a)

async i await to tylko syntax sugar, czyli ładnie opakowane wątki
nie było tego w ogóle przed .NET 4.5

Istnieje NuGetowy pakiet Microsoft.Bcl.Async dodający obsługę async pod 4.0, a co za tym idzie - także na Windows XP.

0

@Azarien czyli mozna powiedzieć, ze taski i async/await działają na puli dostępnych wątków a jak jest potrzeba tworzą nowy a klasa thread zwykły multitasking tworzy nowe watki z poza puli?

0

Mniej więcej, przy czym na przykład asynchroniczne eventy w WinForms działają na wątku głównym aplikacji.
Task jest pewną wyższą abstrakcją, „zadaniem do wykonania”, a czy tworzony jest nowy wątek czy nie, i na którym wątku task się wykona to już jest szczegół implementacyjny.

0

@Azarien - wychodzi na to, ze tworząc metodę do obsługi buttona w win forms i zmieniając w niej wartość kontrolki nie muszę korzystać z delegata Action?

0

@Azarien hm.. To powyższe mi sie wyjaśniło natomiast inna kwestia jest dla mnie dość nie jasna.
Czy dobrze rozumiem: korzystanie z async i await jest jakby korzystaniem z zwyczajnych Taskow tyle, ze ładnie opakowanych?

Gdzie to jest jakos ładnie rozpisane, rozrysowane? Rzucisz jakimś linkiem?

0

Czy dobrze rozumiem: korzystanie z async i await jest jakby korzystaniem z zwyczajnych Taskow tyle, ze ładnie opakowanych?

Nie. Przeczytaj jeszcze raz wszystko.

0

Słowo async oznacza tylko tyle, że w ciele metody znajduje się słowo await.
A await to nie tyle opakowanie na cokolwiek, tylko rodzaj instrukcji sterującej przepływem, jak while czy break. Albo bardziej jak yield, bo ma z nim sporo wspólnego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1