【问题标题】:What is the best way to wait for a task to finish with respect to .NET?等待 .NET 任务完成的最佳方式是什么?
【发布时间】:2017-12-08 07:09:36
【问题描述】:

这是我们的async 方法,它在任务中执行了很长时间。

public async Task<int> LongRunningMethod(T p1, T p2, T p3);

我团队中的一些开发人员使用

Task t = Task.Factory.StartNew(LongRunningMethod(p1,p2,p3));
t.Wait();  //This will suspend main thread and wait for 't' to finish.

虽然有些用

await LongRunningMethod(p1,p2,p3);
// Here too, we simply 'await' till the method finishes.

注意:我们有一个异步任务,我们希望等到该任务完成。

简而言之,以上两种构造中哪一种是最好的?

【问题讨论】:

  • 请定义“最佳”
  • 为什么不异步等待(即await)任务完成?在这种情况下,也使用 Task.Factory.StartNew 不太可能是正确的,因为您遇到了嵌套任务问题(例如 Task&lt;Task&gt;Task&lt;Task&lt;int&gt;&gt; 此处)。首选 Task.Run,​​除非您有不使用它的令人信服的理由(例如已经与 StartNew 一起使用的现有遗留代码)。
  • 这是Task 而不是Thread。不,它们不一定是同一回事。请参阅here 了解差异,以及here

标签: c# .net multithreading asynchronous .net-4.5


【解决方案1】:

简而言之,以上两种构造中哪一种是最好的?

您会知道影响,当系统可扩展性出现时,Task.Wait()await Task 之间的区别在于它们对待调用/执行线程的方式。当第一个阻塞直到完成发生时,另一个使用 await 的调用者将释放调用者,但请注意仅用于真正的异步调用,这意味着 IO 调用、网络调用、不在内存中的数据库调用逻辑处理,并公开异步 API,即在调用线程或释放上下文时。对于真正的 Async 调用,它将使用 Windows 中的 IO 完成端口(排队机制)来执行 Async 管道。

如果调用链末尾的最终方法不是真正的异步,则不会发生这种情况。

它们看起来几乎相似 Waitawait

确实,这两个延续都会在完成后执行,但我们举个例子,通常处理的线程与系统中的核心数量直接相关,使用 TPL 这些线程是从池中调用的,并且数量有限制可用的线程数。对于像 100 K / sec 请求这样的高可扩展系统,Task.Wait() 会很快超时运行一个长时间运行的方法,因为线程忙于闲置并阻塞,它们不会接受新请求,但对于 await 没有这样的阻塞完全发生了。

实际例子

  • Javascript,NodeJs 默认总是去异步请求,没有阻塞,这就是系统高度可扩展的原因

  • 还要考虑ConfigureAwait(false),连同await,那么它就不会寻找相同的线程上下文来重新进入以继续执行,这样效率更高

【讨论】:

    【解决方案2】:

    使用任务的目的是从相同的上下文中并行执行一些任务。如果您想从上下文开始一个长时间运行的任务并且只想等待任务完成,那么您展示的两种方法都将以相同的方式工作。

    但是如果你想在长时间运行的任务执行过程中做任何其他操作, 你可以这样做

    Task taskObj = LongRunningMethod();
    /// Do some other operations here...
    var result = await taskObj;
    

    但是如果需要长时间运行任务的结果来执行某些操作,则需要等待任务完成。 或者你可以使用 Task.ContinueWith()

    【讨论】:

    • 随着 await 的引入,我没有看到 ContinueWith 的用例,它在 Pre await 设置中很流行,但它具有与 Task.Wait 相同的限制跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多