繁体   English   中英

理解异步/等待

[英]Understanding Async/Await

我知道如何使用任务等让它在没有异步/等待的情况下工作,但是我看过的所有示例和视频我仍然无法弄清楚。 有些人通过在按钮单击中创建任务然后等待该任务来完成它?

迄今为止:

private async void button1_Click(object sender, EventArgs e) {
    var vari = await GetId();
    comboBox1.Items.Add(vari);
}
private  Task<string> GetId() {
    return  Task.Run(() => {
         return getstring();
    });
}
public string getstring() {
    Thread.Sleep(5000);//simulate long task
    string d = "Example";
    return d;
}

我已经尝试了几种不同的方法,这是正确的做法吗? 有没有一种方法可以消除在GetId()方法中运行另一个任务,并在那里返回一个字符串?

有没有一种方法可以消除在 GetId() 方法中运行另一个任务,并在那里返回一个字符串?

Task.Run只是在新线程上执行操作。 如果不这样做直接调用GetId ,它只会在UI线程上运行,阻塞UI 5秒。

仅将方法标记为async并不会使其在新线程上运行,这仅意味着该方法使用await 如果你这样做:

private async void button1_Click(object sender, EventArgs e) {
    var vari = await GetId();
    comboBox1.Items.Add(vari);
}
private async Task<string> GetId() {
    Thread.Sleep(5000);//simulate long task
    string d = "Example";
    return d;
}

它会编译(带有警告,因为GetId不使用await ),但它会在 UI 线程上同步执行。

但是,您可以做的是用Task.Delay (异步)替换Thread.Sleep (同步):

private async void button1_Click(object sender, EventArgs e) {
    var vari = await GetId();
    comboBox1.Items.Add(vari);
}
private async Task<string> GetId() {
    await Task.Delay(5000); //simulate long task
    string d = "Example";
    return d;
}

在这种情况下,不涉及新线程。 在后台, Task.Delay只是设置了一种计时器,当延迟过去时,它将执行方法的其余部分(在await )。 与此同时,UI 线程可以自由地做其他事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM