我有一个I/O绑定的方法,我希望异步运行。
在帮助文档中提到,我应该在不使用Task.Run的情况下使用async和await
引用如下:
对于I/O绑定的代码,您可以在async方法内等待返回Task或Task的操作。
我如何从winforms按钮单击事件中做到这一点?
我已经尝试过了
private void button_Click(object sender, EventArgs e)
{
await doLoadJob();
}
private async Task<int> doLoadJob()
{
await loadJob();
return 0;
}
private async void button_Click(object sender, EventArgs e)
- JohanPloadJob()
是一个同步方法,而不是异步方法,所以你收到的警告已经有了答案:“或者使用 'await Task.Run(...)' 在后台线程上执行 CPU 绑定的工作”。因此,在你的处理程序中使用await Task.Run(() => loadJob())
(以及像其他人建议的那样使处理程序异步)。如果可能的话最好将loadJob()
改为异步,但只要它保持同步,你就需要这样做。 - sellotapeloadJob()
似乎是同步的,无论其活动的性质如何。只要它是同步的,你就必须使用Task.Run()
来实现你想要的效果。你刚刚添加的引用说:“对于I/O绑定的代码,你在异步方法内等待返回Task或Task的操作”-loadJob()
是否返回一个Task
? - sellotapeTask.Run()
,否则处理程序将会阻塞。 - sellotape