为了搞清.net的执行顺序咱们作以下准备异步
1,作3个任务,分别往3个文本文件写入100万行时间戳,每一个任务根据计算大概须要400+毫秒。async
DateTime dt1;
private void dowork1() { using (System.IO.StreamWriter writer = File.AppendText("newfile1.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now-dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork2() { using (System.IO.StreamWriter writer = File.AppendText("newfile2.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } } private void dowork3() { using (System.IO.StreamWriter writer = File.AppendText("newfile3.txt")) { for (int i = 0; i < 1000000; ++i) { writer.WriteLine((DateTime.Now - dt1).Milliseconds.ToString()); } writer.Close(); } }
2,采用以下方法调用者三个任务:以线程的方式调用任务1,而后调用任务2,最后调用任务3。.net
dt1 = DateTime.Now; Task t1 = new Task(dowork1); t1.Start(); dowork2(); dowork3();
3,最终得出第一个结果:线程
查看每一个任务写入文本文件的时间戳就很容易发现:orm
4,那么异步的执行顺序是如何的呢?blog
咱们用下面的代码当模拟一项工做,耗时5s同步
private Task Worker1() { return Task.Run(()=> { System.Threading.Thread.Sleep(5000); }); }
而后在winform里面把工做状态显示出来。很明显执行到这里的时候label1变成"Worker starting to work",五秒后变成"Worker done"it
label1.Text = "Worker starting to work"; await Worker1(); label1.Text = "Worker done";
5,最终得出第二个结果,采用async/await异步的时候是顺序执行的,好处是能够跟同步任务同样理解,又不至于引发UI卡死form