加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 正确使用Async / Await的困惑

发布时间:2020-12-15 23:48:29 所属栏目:百科 来源:网络整理
导读:这是我在 Windows Forms Application中实现的async / await async Taskint DoAysnc1(){ await Task.Delay(3000); return 3000;}async Taskint DoAsync2(){ await Task.Delay(5000); return 5000;}private async void button1_Click(object sender,EventArgs
这是我在 Windows Forms Application中实现的async / await

async Task<int> DoAysnc1()
{
    await Task.Delay(3000);
    return 3000;
}

async Task<int> DoAsync2()
{
    await Task.Delay(5000);
    return 5000;
}

private async void button1_Click(object sender,EventArgs e)
{
    this.textBox1.Text = "";
    var doAsync1 = DoAysnc1();
    var doAsync2 = DoAysnc2();
    var async1 = await doAsync1;
    var async2 = await doAsync2;
    this.textBox1.Text = $"{async1} & {async2}";
}

5秒后,TextBox中的结果为“3000& 5000”.

但是当我像这样修改button1_Click时:

private async void button1_Click(object sender,EventArgs e)
{
    this.textBox1.Text = "";
    var async1 = await DoAysnc1();
    var async2 = await DoAysnc2();
    this.textBox1.Text = $"{async1} & {async2}";
}

结果相同,但需要8秒.

为什么第二版button1_Click充当同步?

解决方法

以下是对差异的解释:

this.textBox1.Text = "";
var doAsync1 = DoAysnc1();         // <--- Run DoAsync1
var doAsync2 = DoAysnc2();         // <--- Run DoAsync2
var async1 = await doAsync1;       // <--- wait for DoAsync1 to finish
var async2 = await doAsync2;       //<--- wait for DoAsync2 to finish
this.textBox1.Text = $"{async1} & {async2}";

而:

this.textBox1.Text = "";
var async1 = await DoAysnc1();          // <-- Run DoAsync1 and wait for it to be done
var async2 = await DoAysnc2();          // <-- Run DoAsync2 and wait for it to be done
this.textBox1.Text = $"{async1} & {async2}";

因此在第一个版本中,两个任务都在同一时间运行.在第二个版本中,您从未运行第二个任务,直到第一个任务完成.

我认为阅读这篇Article对您的知识来说将是一个很大的优势.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读