【问题标题】:Async modifier in C#C# 中的异步修饰符
【发布时间】:2014-03-28 16:13:40
【问题描述】:

我有一个问题,这两种方法有什么区别?

    async private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

它们都阻止了我的用户界面。我知道我必须启动另一个线程以避免阻塞,但我发现:

“异步方法提供了一种方便的方法来完成可能长时间运行的工作,而不会阻塞调用者的线程”。

我有点困惑。

【问题讨论】:

  • 您可以使用异步,但请确保您使用“等待”..
  • 您知道使用async 方法得到的编译器警告吗?阅读。它会告诉你出了什么问题。

标签: c#


【解决方案1】:

添加async 本身除了允许方法体使用await 关键字外没有任何作用。一个正确实现的异步方法不会阻塞 UI 线程,但一个不正确实现的方法肯定可以。

你可能想做的是:

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    await Task.Delay(2000);
    MessageBox.Show("All done!");
}

【讨论】:

    【解决方案2】:

    async 本身不会启用异步(非阻塞)方法调用。
    您应该在async 函数中使用await

    您应该阅读this 以更好地了解此功能。

    【讨论】:

      【解决方案3】:

      1) Async 键工作通过时间片使方法异步且无阻塞。 Async 必须与 await 一起存在,它告诉等待任务完成,但所有 之前的东西会被执行。

      async private void Button_Click_1(object sender, RoutedEventArgs e)
      {
          var task = Task.Delay(1000);
      
          /*Do stuff*/
      
          await task;
      }
      

      2) 只让一个线程休眠,上面的任何代码都不会执行,只有在线程休眠完成任务之后。

      private void Button_Click_2(object sender, RoutedEventArgs e)
      {
          Thread.Sleep(2000);
          /*Do stuff*/
      }
      

      在 msdn Asynchronous Programming with Async and Await 上有很好的阅读!

      【讨论】:

      • 您的任务正在那里进行阻塞等待,这会不必要地消耗线程池的时间。通过使用Task.Delay,您可以使整个事情正确地异步,而不是使用异步而不是同步。
      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2021-09-19
      • 2013-05-28
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多