[英]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.