C# async/await - způsob zápisu, nebo funkcionalita? rubrika: Programování: .Net

1 skybedy
položil/-a 26.9.2018
 
upravil/-a 26.9.2018

Pořád jsem v C# pouze mírně pokročilý začátečník, takže omluva za dotaz, je-li blbý.
Mějme v rámci konzolové aplikace, dejme tomu, tenhle kousek kódu:

static async void  Foo() {
  byte cislo1 = await TestTask1(1);
  Console.WriteLine("Číslo 1 je {0}",  cislo1.ToString());
 
  byte cislo2 =  await TestTask2(1);
  Console.WriteLine("Číslo 2 je {0}",  cislo2.ToString());
} 
 
 
static Task<byte> TestTask1(byte cislo) {
  return Task.Run(() => {
     return cislo;
  });
}
 
static async Task<byte> TestTask2(byte cislo) {
  return await Task.Run(() => {
     return cislo;
  });
}

A dotaz zní, má-li async/await v TestTask2 nějaký význam, nebo jde jen o způsob zápisu aby bylo jasné, že jde o Task asynchronní?
Díky.

odkaz Vyřešeno
7 harrison314
odpověděl/-a 26.9.2018
 
upravil/-a 26.9.2018

V tvojom kode nie.
async/await ma vyznam pri IO operaciach, ked procesor caka napriklad na sietovu kartu, disk, databazu... vdaaka nim neblokujes thread poll ani nevytvaras nove thready.

Sam o sebe async/await nerobi kod asnychronny, ani nepracuje s vlaknami.

No async await je owerhead vtedy ak robis nieco na CPU, vtedy ich nepouzivaj a uz vobec nie s Task.Run, to je antipatern.

Tu je prednaska o tom ako to funguje https://www.youtube.com/watch?v=fHcEt1b_ifw

Komentáře

  • skybedy : Za tip na přednášku díky, tuhle neznám. Já vím jak async/await obecně funguje, šlo mi o to, zda je rozdíl v použití těhle klíčových slov na příkladech, které jsem dal. Trochu mě mate tvrzení, že použití v Task.Run je antipattern, ve většině videí na YT to bylo používáno právě takhle, nicméně je pravda, že jde o videa pár let stará a vývoj šel jinam. 26.9.2018
  • harrison314 : Pouzitie Task.Run s async/await je antipatern, lebo si treba uvedomit co to spravi. Task.Run pouzije alebo vytvori nove vlakno s Thread Poolu a potom pockas na jeho dokoncenie pomocou await. tym si zbytocne sposobil vytvaranie vlakna a nasledne prepinanie kontextu. Ak potrebujes vratit nieco do asynchronneho kodu pouzi metodu Task.FromResult, alebo Task.CompletedTask, ked potrebujes kod "zasynchronit" aby neblokoval Thread Poll pouzijes Task.Yield() 26.9.2018
  • skybedy : Vypadá to, že máš pravdu, díky. 26.9.2018

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.