此示例非常清楚地说明了差异。通过异步/等待,调用线程将不会阻塞并继续执行。
static void Main(string[] args)
{
WriteOutput("Program Begin");
// DoAsTask();
DoAsAsync();
WriteOutput("Program End");
Console.ReadLine();
}
static void DoAsTask()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
t.Wait();
WriteOutput("3 - Task completed with result: " + t.Result);
}
static async Task DoAsAsync()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
var result = await t;
WriteOutput("3 - Task completed with result: " + result);
}
static int DoSomethingThatTakesTime()
{
WriteOutput("A - Started something");
Thread.Sleep(1000);
WriteOutput("B - Completed something");
return 123;
}
static void WriteOutput(string message)
{
Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
}
DoAsTask输出:
[1]程序开始
[1] 1-开始
[1] 2-任务开始
[3] A-开始某件事
[3] B-完成了某件事
[1] 3-任务完成,结果:123
[1]程序结束
DoAsAsync输出:
[1]程序开始
[1] 1-开始
[1] 2-任务开始
[3] A-开始某件事
[1]程序结束
[3] B-完成了某件事
[3] 3-任务完成,结果:123
更新:通过在输出中显示线程ID的改进示例。
Task
耗时10 msTask
的线程实际上在线程上执行了10个小时的时间,从而阻塞了整个10个小时,您会如何想呢?