如何在一个耗时的方法上使用async和await

时间:2014-07-10 15:17:12

标签: c# multithreading asynchronous async-await

我有这样的方法:

public void ButtonClicked()
{
     var MyResult=MyTimeConsumingTask(MyClassProperty); 
 }

如您所见,它会阻止UI线程。

我可以创建一个backgroundWorker并在该后台线程上运行此方法,但我希望看看使用Async和Await是否可以帮助我简化它。

这不起作用:

public async void ButtonClicked()
{
    await var MyResult=MyTimeConsumingTask(MyClassProperty); 
}

我该怎么做?

我想知道一般的解决方案,但也注意到MyimeConsumingTask正在等待网络上的一些数据,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:4)

为了能够等待 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"));

我肯定更喜欢第一个,但如果已经正常工作且很难改变方法,那么第二个更容易使用。