C#5.0引入了async和await关键字,这可以让我们用很少的代码实现异步编程,假设再同步编程中,点击按钮后要运行耗时5s的运算,这时候界面就会卡死,等着5s的运算结束后用户才能继续操作界面,而用异步编程的话,点完按钮后,着5s的运算会在另一个线程中执行,同时用户可以立即操作界面。
废话不多说,上代码:
硬件:ThinkPad T570
系统:Win10
开发环境:VS2019
新建一个winform程序,Form1.cs中代码如下:
private void button1_Click(object sender, EventArgs e)
{
Trace.WriteLine("button1_Click");
asyncMethod();
Trace.WriteLine("after button1_Click");
button1.Text = "button";
}
private async Task asyncMethod()
{
Trace.WriteLine("async Task asyncMethod");
button1.Text = await SleepMethod();
Trace.WriteLine("after async Task asyncMethod");
}
private Task<string> SleepMethod()
{
Trace.WriteLine("SleepMethod");
var t = Task.Run(() => {
Thread.Sleep(5000);
Trace.WriteLine("after sleep 5s");
return "after sleep 5s";
});
Trace.WriteLine("after Task.Run()");
return t;
}
执行顺序如下:
button1_Click
async Task asyncMethod
SleepMethod
after Task.Run()
after button1_Click
after sleep 5s
after async Task asyncMethod
在用async声明的函数中有await函数,当执行到await行时候,代码会启动一个task任务执行异步任务,同时代码执行权回到调用异步函数中去继续执行不必等待task任务执行结束,当task执行结束后会自动调用await后面的代码,相当于传统多线程方式中的回调函数
其实上面3个函数可以简化成一个函数,为button1_Click()函数添加async关键字,然后在函数内部直接加个任务,并用await修饰任务返回值即可:
private async void button1_Click(object sender, EventArgs e)
{
var t = Task.Run(() =>
{
Thread.Sleep(5000);
return "after sleep 5s";
});
button1.Text = await t;
}
注意,这时候整个button1_Click()函数是个异步函数,如果这时候,在函数最后添加button1.Text = “button”;的话,该代码还是会等button1.Text = await t;执行完之后再执行!
版权声明:本文为weixin_43935474原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。