bur*_*1ce 11 .net c# asynchronous task-parallel-library async-await
根据MSDN:
创建将在所有提供的任务完成后完成的任务.
当调用Task.WhenAll()时,它会创建一个任务,但这是否意味着它创建了一个新线程来执行该任务?例如,下面的控制台应用程序中创建了多少个线程?
class Program
{
static void Main(string[] args)
{
RunAsync();
Console.ReadKey();
}
public static async Task RunAsync()
{
Stopwatch sw = new Stopwatch();
sw.Start();
Task<string> google = GetString("http://www.google.com");
Task<string> microsoft = GetString("http://www.microsoft.com");
Task<string> lifehacker = GetString("http://www.lifehacker.com");
Task<string> engadget = GetString("http://www.engadget.com");
await Task.WhenAll(google, microsoft, lifehacker, engadget);
sw.Stop();
Console.WriteLine("Time elapsed: " + sw.Elapsed.TotalSeconds);
}
public static async Task<string> GetString(string url)
{
using (var client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 13
WhenAll
不会创建新线程."任务"并不一定意味着一个线程; 有两种类型的任务:"事件"任务(例如TaskCompletionSource
)和"代码"任务(例如Task.Run
).WhenAll
是一个事件样式的任务,因此它不代表代码.如果您是新手async
,我建议从我的介绍性博客文章开始.
您的测试应用程序将根据需要使用线程池线程和IOCP线程来完成async
方法,因此它可以运行少至2个线程或多达5个.如果您对线程的准确程度感到好奇,可以查看我最近关于async
线程的博文.