• 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 += "
    ";
        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}
    ", 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.
    ";
        // 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();

  • 相关阅读:
    18.12.30 【sssx】Trie图
    18.12.30 【sssx】线段树
    18.12.25 POJ 1039 Pipe
    18.12.25 POJ 3525 Most Distant Point from the Sea(半平面+二分)
    18.12.25 POJ 1228 Grandpa's Estate
    18.12.22 luogu P3047 [USACO12FEB]附近的牛Nearby Cows
    18.12.21 DSA 中缀表达式的值
    18.12.21 luogu P3650 [USACO1.3]滑雪课程设计Ski Course Design
    18.12.21 【USACO】Times17
    18.12.20 DSA Full Tank?(DP+BFS)
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/11812153.html
Copyright © 2020-2023  润新知