/ / Rozdiely medzi Async CTP a Bcl.Async pri volaní async metód ako sync - task-parallel-library, async-await, async-ctp

Rozdiely medzi Async CTP a Bcl.Async pri volaní metód async ako sync - task-parallel-library, async-await, async-ctp

V súčasnosti sa snažím urobiť nejaký kódnapísané vo VS 2012, s použitím Microsoft.Bcl.Async a .NET 4.0, fungujú vo VS 2010. Pre VS 2010 som nainštaloval Async CTP (ver. 3) tak, že som schopný zostaviť svoj projekt napísaný v V S2012 ,

Po pomerne veľkom probléme s prácou s Async CTP som teraz schopný zostaviť svoj projekt v rámci VS 2012, ako aj VS 2010.

Vidím však určité rozdiely v spôsobe fungovania kódu v čase spustenia. Kód, ktorý vykonávam, je uvedený nižšie:

public class Fetcher
{
public string RunTask()
{
Task<string> task = TaskEx.Run(() => RunTaskAsync());
return task.Result;
}

public async Task<string> RunTaskAsync()
{
await TaskEx.Delay(1);
return "Hello";
}
}

V podstate to, čo mám, je asynchrónna metóda, pre ktorú potrebujem mať synchronizačný obal, takže klienti môžu volať buď asynchrónnu alebo synchronizačnú verziu metódy.

Problém: Pri spustení kódu z VS 2012 obe metódyvráti výsledok "Ahoj", a čo je dôležitejšie, obe metódy skončia správne. Spustenie kódu z VS 2010 je však ďaleko odlišný príbeh. Metóda async funguje tak, ako bolo zamýšľané, ale metóda sync wrapperu jednoducho visí a výsledok sa nikdy nevytvorí.

Vzhľadom k tomu, že som celkom nová koncepcia TPL aasync / wait, ja mám nejaké problémy s vysvetlením správania, ktoré tu vidím. Existuje nejaký druh obmedzenia v Async CTP, do ktorého sa vkladá, že si nie som vedomý, alebo to robím koncepčne zlým spôsobom?

odpovede:

4 pre odpoveď č. 1

Ako všeobecné pravidlo, synchrónne obaly okolo asynchrónnych metód sa dôrazne neodporúčajú, Pri použití Result prístup riziko zablokovania (ako som opísal na svojom blogu); tiež, Result bude zabaliť všetky výnimky, čo robí vaše spracovanie chýb oveľa zložitejšie.

Takže som povedal, že to nerobte.

Pokiaľ ide o Async CTP, existuje niekoľko chýb, o ktorých je známe, že existujú (plus niekoľko ďalších, ktoré nie sú verejné). A "nebudú fixovaní." silne odporúčame upgradovať všetkých na VS2012.

Pre tento konkrétny problém to môže súvisieť s výkonom. napr., Task.Delay(1) vráti úlohu, ktorá bude dokončená takmer okamžite, takže existuje podmienka medzi štartom oneskorenia a. \ t await kontroluje, či je úloha už dokončená. Takže je možné, že zlepšenie výkonu v oficiálnom Microsoft.Bcl.Async spôsobujú rozdiel v správaní.