Я прочитал Eric lippert's article около async
, а также о путаницах людей, имеющих ключевое слово async
. он сказал:async - остаться в текущей теме?
он (
async
) означает «этот метод содержит поток управления, который включает в себя ожидающий асинхронных операций и, следовательно, будет переписаны в компиляторе в продолжение прохождения стиля для того, чтобы асинхронных операций могут возобновить этот метод в нужном месте.»Всего смысл асинхронных методов это то, что вы остаетесь в текущем потоке как можно больше
Я не понимаю этого. Если я выполняю асинхронный метод (Task
), и он запускается, он уверенно работает на другом потоке.
Кроме того, если я пишу метод использует await
, (IMHO) он освобождает нормальный поток управления, а код переработан похожи «ContinueWith
» позже, другой резьбы.
Я тестировал его с (консоли):
/*1*/ public void StartChain()
/*2*/ {
/*3*/ var a = FuncA();
/*4*/ Console.WriteLine(a.Result);
/*5*/ }
/*6*/
/*7*/ public async Task <int> FuncA()
/*8*/ {
/*9*/ Console.WriteLine("A--" + Thread.CurrentThread.ManagedThreadId);
/*10*/ var t = await FuncB();
/*11*/ Console.WriteLine("B--" + Thread.CurrentThread.ManagedThreadId);
/*12*/ return t;
/*13*/ }
/*14*/
/*15*/ public async Task <int> FuncB()
/*16*/ {
/*17*/ Console.WriteLine("C--" + Thread.CurrentThread.ManagedThreadId);
/*18*/ await Task.Delay(2000);
/*19*/ Console.WriteLine("D--" + Thread.CurrentThread.ManagedThreadId);
/*20*/ return 999;
/*21*/ }
/*22*/
/*23*/ void Main()
/*24*/ {
/*25*/ StartChain();
/*26*/ }
/*27*/
результат:
A--7
C--7
D--17 <-----D and B are on different thread
B--17
999
Так что же Эрик в виду, говоря "остаться на текущей теме"?
редактировать 1:
в asp.net
она также возвращает идентификатор потока различно.
public async Task<int> FuncA()
{
Response.Write("<br/>C----" + Thread.CurrentThread.ManagedThreadId);
var t = await FuncB();
Response.Write("<br/>D----" + Thread.CurrentThread.ManagedThreadId);
return t;
}
public async Task<int> FuncB()
{
Response.Write("<br/>E----" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(2000);
Response.Write("<br/>F----" + Thread.CurrentThread.ManagedThreadId);
return 999;
}
protected async void Page_Load(object sender, EventArgs e)
{
Response.Write("<br/>A----" + Thread.CurrentThread.ManagedThreadId);
var a=await FuncA();
Response.Write("<br/>B----" + Thread.CurrentThread.ManagedThreadId);
}
A----8
C----8
E----8
F----9
D----9
B----9
редактировать 2
(после получения ответа)
, кажется, что нить подается только в GUI приложений:. Я запускаю этот код на WinForm
public async Task<int> FuncA()
{
textBox1.Text +=Environment.NewLine+ "\nC----" + Thread.CurrentThread.ManagedThreadId;
var t = await FuncB();
textBox1.Text += Environment.NewLine + "\nD----" + Thread.CurrentThread.ManagedThreadId;
return t;
}
public async Task<int> FuncB()
{
textBox1.Text += Environment.NewLine + "\nE----" + Thread.CurrentThread.ManagedThreadId;
await Task.Delay(2000);
textBox1.Text += Environment.NewLine + "\nF----" + Thread.CurrentThread.ManagedThreadId;
return 999;
}
private async void Form1_Load(object sender, EventArgs e)
{
textBox1.Text += Environment.NewLine + "\nA----" + Thread.CurrentThread.ManagedThreadId;
var a = await FuncA();
textBox1.Text += Environment.NewLine + "\nB----" + Thread.CurrentThread.ManagedThreadId;
}
Ссылка на статью, которую вы смущаетесь о –
@downvoter - комментарий был бы полезен. –
Задача, которую вы ожидаете, выполняется в другом потоке. Весь другой код в методе async выполняется в исходном потоке. Await НЕ запускает новую задачу. Это эквивалентно ContinueWith в ORIGINAL thread. Есть несколько блогов, которые обсуждают это. –