C#异步编程----async和await组合的写法

微软示例:

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int>, which means that the method
    // eventually produces an int result. However, ExampleMethodAsync returns
    // the Task<int> value as soon as it reaches an await.
    ResultsTextBox.Text += "\n";
    try
    {
        int length = await ExampleMethodAsync();
        // Note that you could put "await ExampleMethodAsync()" in the next line where
        // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
        // would not see the global side effect of ExampleMethodAsync setting the text.
        ResultsTextBox.Text += String.Format("Length: {0}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
    ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
    // After the following return statement, any method that's awaiting
    // ExampleMethodAsync (in this case, StartButton_Click) can get the 
    // integer result.
    return exampleInt;
}
// Output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292

上面是微软给的写法,给按钮的响应方法加上async,然后await ExampleMethodAsync

 

但是其实async和await表达式写法:

private async void button_Click(object sender, RoutedEventArgs e)
{
  TB_Result.Text = await exampleAsync();
}
 
 private async Task<string> exampleAsync()
  {
     return await Task.Run(() =>
     {
         WebClient w = new WebClient();
         w.DownloadFile("http://provissy.com", "webPage1");
         w.DownloadFile("http://microsoft.com", "webPage2");
         string a = w.DownloadString("http://microsoft.com");
         return a;
      });
 }
 

Task.Run 和 Lambda表达式,用起来其实更加简单。

在 => { }范围内写任何代码都是异步执行的,因此不用担心某几个语句是否会长时间堵住UI线程。

当然,你不能访问UI线程,否则会抛出异常。

 要是访问UI线程,可以加上Dispacter.BeginInvoke();

 

posted @ 2019-11-07 15:05  卖雨伞的小男孩  阅读(847)  评论(0编辑  收藏  举报