【发布时间】:2014-05-15 05:48:33
【问题描述】:
来自MSDN:
async 和 await 关键字不会导致额外的线程 创建。异步方法不需要多线程,因为异步 方法不在自己的线程上运行。该方法在当前运行 同步上下文并仅在线程上使用时间 方法处于活动状态。
我从“async 和 await 关键字不会导致创建额外的线程”中得出的结论是它只是使用已经从线程池创建的线程,这很好,但我难以理解的一点是“使用时间当方法处于活动状态时在线程上”。
这是否意味着当我在等待任务时,任务会“移动”到当前线程,还是将结果编组回当前线程?如果您查看输出,结果会在不同的线程 ID 上返回,但在它们全部完成后在原始线程上完成。我想我错过了这两个操作的“中间”。
void Main()
{
var tasks = new List<Task<byte[]>>();
Console.WriteLine ("Starting on Managed Thread ID {0}, Background {1}, Pool {2}\n",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
for (int i = 0; i < 5; i++)
{
tasks.Add(WriteFile(@"D:\Temp\" + i + ".txt", new String('*', i)));
}
Console.WriteLine ("Before Wait()ing on Managed Thread ID {0}, Background {1}, Pool {2}",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
Task.WhenAll(tasks).Wait();
Console.WriteLine ("Completed on Managed Thread ID {0}, Background {1}, Pool {2}",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
}
async Task<byte[]> WriteFile(string path, string text)
{
FileStream fs = new FileStream(path, FileMode.Create);
try
{
Console.WriteLine ("Writing to file " + path + " . Managed Thread ID {0}, Background {1}, Pool {2}",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
var bytes = Encoding.Unicode.GetBytes(text);
await fs.WriteAsync(bytes, 0, bytes.Length);
Console.WriteLine ("Finished writing to file " + path + ". Managed Thread ID {0}, Background {1}, Pool {2}",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
return new byte[0];
}
finally
{
Console.WriteLine ("Finally! " + path + ". Managed Thread ID {0}, Background {1}, Pool {2}\n",
Thread.CurrentThread.ManagedThreadId,
System.Threading.Thread.CurrentThread.IsBackground,
System.Threading.Thread.CurrentThread.IsThreadPoolThread);
fs.Dispose();
}
}
输出:
Starting on Managed Thread ID 46, Background True, Pool False
Writing to file D:\Temp\0.txt . Managed Thread ID 46, Background True, Pool False
Finished writing to file D:\Temp\0.txt. Managed Thread ID 12, Background True, Pool True
Finally! D:\Temp\0.txt. Managed Thread ID 12, Background True, Pool True
Writing to file D:\Temp\1.txt . Managed Thread ID 46, Background True, Pool False
Finished writing to file D:\Temp\1.txt. Managed Thread ID 12, Background True, Pool True
Finally! D:\Temp\1.txt. Managed Thread ID 12, Background True, Pool True
Writing to file D:\Temp\2.txt . Managed Thread ID 46, Background True, Pool False
Finished writing to file D:\Temp\2.txt. Managed Thread ID 12, Background True, Pool True
Finally! D:\Temp\2.txt. Managed Thread ID 12, Background True, Pool True
Writing to file D:\Temp\3.txt . Managed Thread ID 46, Background True, Pool False
Finished writing to file D:\Temp\3.txt. Managed Thread ID 24, Background True, Pool True
Finally! D:\Temp\3.txt. Managed Thread ID 24, Background True, Pool True
Writing to file D:\Temp\4.txt . Managed Thread ID 46, Background True, Pool False
Before Wait()ing on Managed Thread ID 46, Background True, Pool False
Finished writing to file D:\Temp\4.txt. Managed Thread ID 18, Background True, Pool True
Finally! D:\Temp\4.txt. Managed Thread ID 18, Background True, Pool True
Completed on Managed Thread ID 46, Background True, Pool False
【问题讨论】:
标签: c# asynchronous async-await