C#中的异步编程
2017-06-22 本文已影响272人
心彻
假如我有6个Task任务,我需要等这6个任务都执行完了才能去执行主任务,这很简单,就是普通的顺序写代码就好了:
static void Main(string[] args)
{
Test();
Console.WriteLine("Main End");
}
static void Test()
{
var task1 = Task.Run(() => {
Thread.Sleep(6000);
Console.WriteLine("task1");
});
var task2 = Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("task2");
});
var task3 = Task.Run(() => {
Thread.Sleep(3000);
Console.WriteLine("task3");
});
var task4 = Task.Factory.StartNew(() => {
Thread.Sleep(4000);
Console.WriteLine("task4");
});
var task5 = Task.Run(() => {
Thread.Sleep(5000);
Console.WriteLine("task5");
});
Task.WaitAny(task1, task2, task3, task4, task5);
Console.WriteLine("WaitAny");
Task.WaitAll(task1, task2, task3, task4, task5);
Console.WriteLine("WaitAll");
}
但是,如果我不希望这6个耗时的任务阻塞我主程序里后续代码的执行呢?那么就需要用到async和await了,代码如下:
static void Main(string[] args)
{
Task t=Test();
//t.Wait();
Console.WriteLine("Main End");
//t.Wait();
}
static async Task Test()
{
var task1 = Task.Run(() => {
Thread.Sleep(6000);
Console.WriteLine("task1");
});
var task2 = Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("task2");
});
var task3 = Task.Run(() => {
Thread.Sleep(3000);
Console.WriteLine("task3");
});
var task4 = Task.Factory.StartNew(() => {
Thread.Sleep(4000);
Console.WriteLine("task4");
});
var task5 = Task.Run(() => {
Thread.Sleep(5000);
Console.WriteLine("task5");
});
await Task.WhenAny(new Task[] { task1, task2, task3, task4, task5 });
Console.WriteLine("有一个任务完成");
await Task.WhenAll(new Task[] { task1, task2, task3, task4, task5 });
Console.WriteLine("全部完成!");
}
此时的运行结果如下:
异步运行结果
如果我想看到异步方法里的执行过程呢?很简单,把第二个t.Wait()的注释取消即可。如果把第一个t.Wait()方法的注释取消的话,那么即便使用了async和await,这段代码也被阻塞成同步方法了。Console.Read()和t.Wait()有异曲同工之处。
就写这么多吧,比较简单。其实C#的异步编程涉及到的内容很多也很复杂,虽然只写了这么简单的一点点,但是我看了很多文章,列表如下:
C#线程
async And await异步编程活用基础
如何正确理解.NET 4.5和C# 5.0中的async/await异步编程模式?
其他一些参考:
Task.Run vs Task.Factory.StartNew
关于Console.Read()方法的一些误解!