【问题标题】:why I should use await?为什么我应该使用等待?
【发布时间】:2013-01-07 02:58:57
【问题描述】:

我是异步/等待的新手。但我创建了 POC,但我仍然感到困惑。

方法的结果

public async void WriteLineFunc(string str)
    {
        await Task.Factory.StartNew(() => WaitFor2Secs());
        //WaitFor2Secs();
        Console.WriteLine(str);
    }

public async void WriteLineFunc(string str)
    {
        //await Task.Factory.StartNew(() => WaitFor2Secs());
        WaitFor2Secs();
        Console.WriteLine(str);
    }

是一样的。将方法作为等待有什么意义?只是为了在其他线程上运行一个函数并等待它完成?

【问题讨论】:

  • 第一个版本允许主线程在等待的同时做其他事情。第二个版本不让线程在等待期间做任何事情。允许主线程做其他事情意味着应用程序保持响应。
  • 你的意思是声明await Task.Factory.StartNew(() => WaitFor2Secs());等于Task t = Task.Factory.StartNew(() => WaitFor2Secs()); Task.WaitAll(t);
  • 没有。 WaitAll 在等待时将线程作为人质。
  • 线程人质是什么意思?你的意思是同一个线程即使在等待也可以做其他事情?
  • @D J:是的。尝试将此代码放在一个简单的 Windows 窗体或 wpf 项目中。您会发现,在您的第一个示例中,负责发送消息的线程可以继续发送消息并维护响应式用户界面。在您的第二个示例中(假设 WaitFor2Secs 是睡眠),您将阻塞 UI 线程并使您的用户界面在等待期间无响应。

标签: c# multithreading asynchronous async-await c#-5.0


【解决方案1】:

当一个方法使用await时,它可以在完成之前返回给它的调用者。

考虑这个例子:

public async Task WriteLineFuncAsync(string str)
{
  await Task.Delay(2000);
  Console.WriteLine(str);
}

public void WriteLineFunc(string str)
{
  Thread.Sleep(2000);
  Console.WriteLine(str);
}

WriteLineFunc 会同步阻塞正在运行的线程 2 秒然后写出字符串。 WriteLineFuncAsync 将立即返回一个不完整的Task 给它的调用者;两秒后,它会写出字符串,然后完成Task

对于客户端应用程序,主要优点是响应能力(GUI 线程不会被阻塞)。对于服务器端应用程序,主要好处是可扩展性(您可以拥有比线程更多的响应)。

【讨论】:

  • 其实我需要知道 await 背后的概念。我知道它可以帮助我们在后台运行并等待。但是您的异步​​方法与public void WriteLineFuncAsync(string str) { Task t = Task.Factory.StartNew(() => Task.Delay(2000)); Task.WaitAll(t); Console.WriteLine(str); } 相同
  • @DJ 不,不是。一方面,您的方法实际上不会等待。 Task.Delay() 在等待时不会阻塞线程,它只是返回一个Task,它将在给定时间后完成。
  • @DJ:您可能会发现我的async/await intro 很有帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 2019-01-28
  • 1970-01-01
  • 2011-01-12
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多