Podle mého chápání je jednou z hlavních funkcí async
a await
usnadnit psaní a čtení kódu - ale rovná se jejich použití vytváření vláken na pozadí pro provádění logických operací s dlouhým trváním?
V současné době zkouším nejzákladnější příklad. Přidal jsem'pár komentářů inline. Můžete mi to objasnit?
// I don't understand why this method must be marked as `async`.
private async void button1_Click(object sender, EventArgs e)
{
Task<int> access = DoSomethingAsync();
// task independent stuff here
// this line is reached after the 5 seconds sleep from
// DoSomethingAsync() method. Shouldn't it be reached immediately?
int a = 1;
// from my understanding the waiting should be done here.
int x = await access;
}
async Task<int> DoSomethingAsync()
{
// is this executed on a background thread?
System.Threading.Thread.Sleep(5000);
return 1;
}
V návaznosti na ostatní odpovědi se podívejte na await (C# Reference).
a konkrétněji na přiložený příklad, trochu to vysvětluje vaši situaci
Následující příklad pro Windows Forms ilustruje použití funkce await v systému asynchronní metodě WaitAsynchronouslyAsync. Porovnejte chování této metody metody s chováním metody WaitSynchronously. Bez metody await aplikovaného na úlohu, probíhá WaitSynchronously synchronně. navzdory použití modifikátoru async v její definici a volání metody Thread.Sleep v jejím těle.
private async void button1_Click(object sender, EventArgs e)
{
// Call the method that runs asynchronously.
string result = await WaitAsynchronouslyAsync();
// Call the method that runs synchronously.
//string result = await WaitSynchronously ();
// Display the result.
textBox1.Text += result;
}
// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
// Add a using directive for System.Threading.
Thread.Sleep(10000);
return "Finished";
}
Myslím, že jste si vybrali špatný příklad s System.Threading.Thread.Sleep
.
Smyslem asynchronní
úlohy je nechat ji vykonat na pozadí bez uzamčení hlavního vlákna, jako je například provedení DownloadFileAsync
.
System.Threading.Thread.Sleep
není něco, co by se "provádělo", pouze spí, a proto se váš další řádek dostane na řadu až po 5 sekundách ...
Přečtěte si tento článek, myslím, že je to skvělé vysvětlení konceptu async
a await
: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx.
Upřímně řečeno, stále si myslím, že nejlepší vysvětlení je to o budoucnosti a slibech na Wikipedii: http://en.wikipedia.org/wiki/Futures_and_promises.
Základní myšlenka spočívá v tom, že máte samostatný fond vláken, která provádějí úlohy asynchronně. Při jeho používání. Objekt však dává slib, že v určitém čase provede operaci a dá vám výsledek, až si ho vyžádáte. To znamená, že se zablokuje, když si vyžádáte výsledek a ještě není hotový, ale jinak se vykoná ve fondu vláken.
Odtud můžete věci optimalizovat: některé operace lze implementovat asynchronně a věci jako IO souborů a síťovou komunikaci můžete optimalizovat dávkováním následných požadavků a/nebo změnou jejich pořadí. Nejsem si jistý, jestli tohle už je v rámci úloh Microsoftu - ale pokud ne, byla by to jedna z prvních věcí, které bych přidal.
V C# 4.0 můžete vlastně implementovat vzor budoucnosti tak trochu pomocí výnosů. Pokud chcete vědět, jak to přesně funguje, mohu doporučit tento odkaz, který odvádí slušnou práci: http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/ . Pokud si s tím však začnete sami hrát, zjistíte, že pokud chcete dělat všechny ty skvělé věci, opravdu potřebujete podporu jazyka - což je přesně to, co udělal Microsoft.