C# 如何在耗时的方法上使用async和Wait

C# 如何在耗时的方法上使用async和Wait,c#,multithreading,asynchronous,async-await,C#,Multithreading,Asynchronous,Async Await,我有这样一种方法: public void ButtonClicked() { var MyResult=MyTimeConsumingTask(MyClassProperty); } 正如您所看到的,它阻塞了UI线程 我可以创建一个backgroundWorker并在该后台线程上运行此方法,但我希望看看使用Async和Await是否有助于简化此过程 这不起作用: public async void ButtonClicked() { await var MyResult

我有这样一种方法:

public void ButtonClicked()
{
     var MyResult=MyTimeConsumingTask(MyClassProperty); 
 }
正如您所看到的,它阻塞了UI线程

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

这不起作用:

public async void ButtonClicked()
{
    await var MyResult=MyTimeConsumingTask(MyClassProperty); 
}
我该怎么做

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

要能够等待
MyTimeConsumingTask
必须声明它返回一个任务

但在您的情况下,最简单的方法似乎是使用
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");
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"));

我当然更喜欢第一个,但如果第二个已经开始工作并且很难更改方法,那么它更容易使用。

var MyResult=wait Task.Run(()=>MyTimeConsumingTask(MyClassProperty))“这不起作用”信息永远不够。我怀疑您只是想要
var myResult=wait MyTimeConsumingTask(MyClassProperty)但您应该始终在问题中指定错误。单击按钮时,您希望发生的情况可能重复?我假设当
MyTimeConsumingTask
完成时,UI上会发生一些事情?我也假设UI不应该阻塞?@Jonny什么也不应该,因为它不能编译。。。
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");
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"));