如何在耗时的方法上使用async和await
本文关键字:async await 方法 | 更新日期: 2023-09-27 18:12:25
我有一个这样的方法:
public void ButtonClicked()
{
var MyResult=MyTimeConsumingTask(MyClassProperty);
}
如你所见,它阻塞了UI线程。
我可以创建一个backgroundWorker并在该后台线程上运行此方法,但我想看看是否使用Async和Await会帮助我简化这一点。
这是不工作:
public async void ButtonClicked()
{
await var MyResult=MyTimeConsumingTask(MyClassProperty);
}
我该怎么做?
我想知道一般的解决方案,但也注意到MyimeConsumingTask正在等待网络上的一些数据,我该如何解决这个问题?
为了能够等待 MyTimeConsumingTask
,必须声明它返回一个任务。
public async Task<SimeType> MyTimeConsumingTask()
既然你说它做一些网络IO,你可以使用异步NW IO方法重写它,然后等待作为
var MyResult = await MyTimeConsumingTask(MyClassProperty);
但在你的情况下,最简单的方法似乎是使用Task.Run
var MyResult = await Task.Run(() => MyTimeConsumingTask(MyClassProperty));
比较这两种方法:
1。
public async Task<string> GetHtmlAsync(string url)
{
using (var wc = new Webclient())
{
var html = await wc.DownloadStringTaskAsync(url);
//do some dummy work and return
return html.Substring(1, 20);
}
}
var str1 = await GetHtmlAsync("http://www.google.com");
2。
public string GetHtml(string url)
{
using (var wc = new Webclient())
{
var html = wc.DownloadString(url);
//do some dummy work and return
return html.Substring(1, 20);
}
}
var str2 = await Task.Run(()=>GetHtml("http://www.google.com"));
我肯定更喜欢第一个,但如果已经工作并且很难改变方法,则第二个更容易使用。