C# async await 并行执行多任务

.NET 4.5之后版本提供了async 和 await关键字,让多线程的实现优雅了许多.尤其是网络通信时,妈妈再也不用担心我的程序界面会假死啦!~

最近我一直在做一个网页抓取的程序,已经采集到了一大批要抓取的url存在了数据库中,目前单线程吭哧吭哧一天也抓不完几个.

便想到让await并行执行,在C#圣经上看了这一章,但是并没有提到如何让await并行执行,只好自己动手测试.

 

经过几番尝试,最终可用的demo代码如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace MultiAsyncTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public async Task sleep(int index)
        {
            textBox1.AppendText(DateTime.Now.ToString() +"第"+index.ToString()+"个 sleep 开始执行..."+Environment.NewLine);
            await Task.Run(
                () => 
                    {
                        Thread.Sleep(4000);
                    }
                );
            textBox1.AppendText(DateTime.Now.ToString() + "第" + index.ToString() + "个 sleep 执行完成..." + Environment.NewLine);
        }
        

        private async void button1_Click(object sender, EventArgs e)
        {
            var r1 = sleep(1);
            var r2 = sleep(2);
            await sleep(3);
            await sleep(4);

            await r1;
            await r2;
        }
    }
}

运行结果如下:

await-multi-task

 

结果分析:

函数调用时直接使用多个await,是按照顺序,第一个await执行完,然后第二个,第三个

但是不使用await直接调用函数,而是将函数返回值赋值给一个新变量,然后await这个变量,就实现了多个程序同步运行


原创文章,转载请注明: 转载自张哲的博客

本文链接地址: C# async await 并行执行多任务