【问题标题】:Effective non-blocking execution有效的非阻塞执行
【发布时间】:2015-02-15 02:53:17
【问题描述】:

我实现了一个在云上运行的服务。我有一个方法fastExcute(),它可以非常快地进行一些计算。 我需要在方法中添加一个调用IndependentBackgroundMethodAsync() 到其他可以在后台执行的方法,它何时完成它的工作并不重要,但它应该完成!它最终将完成其工作的主要内容 所以我想这样做:

fastExecute()
{
Task task = IndependentBackgroundMethodAsync();
//fast code
await t; < - could cause fastExecute not to be fast
}

另一方面,使代码成为:

fastExecute()
    {
    Task task = IndependentBackgroundMethodAsync();
    //fast code
    }

不保证 IndependentBackgroundMethodAsync 最终会被执行并完成其工作

什么是做我需要做的最佳实践?

【问题讨论】:

  • 方法fastExecute()是否需要后台执行的结果?
  • 你为什么认为await task 会导致你的方法不能“快速”执行?
  • 另外,解释一下“快速”的实际含义会很好。
  • @OldFox - 不,它没有
  • @YuvalItzchakov - ahalan :) IndependentBackgroundMethodAsync 可能需要很长时间才能执行。据我了解,等待等待 IndependentBackgroundMethodAsync 完成其执行:因此,如果原始 fastExecute 需要 1ms 并且 IndependentBackgroundMethodAsync 总共需要 100m,则等待将导致 fastExecute 在 100.001s 期间运行

标签: c# azure asynchronous cloud async-await


【解决方案1】:

如果您想异步执行您的IndependentBackgroundMethodAsync,并且您关心我会使用ContinueWith 的结果(请参阅MSDN continuewith) 任务完成后将执行后续任务。

 fastExecute()
{
Task task = IndependentBackgroundMethodAsync();

task.ContinueWith(result => // handle result); 

 //fast code

}

【讨论】:

  • 我不在乎结果。我只是想执行它
  • 好吧,一旦任务安排好,如果你的服务没有同时崩溃,它就会被执行。所以你的第二个例子应该可以正常工作
  • 恐怕会在2年内执行:)。
  • 可能有问题的场景 fastExecute 在该 fastExecute 之后再次开始执行 IndependentBackgroundMethodAsync 并且在前一个未完成时也启动 IndependentBackgroundMethodAsync ==> 到许多 IndependentBackgroundMethodAsync 排队
  • 为您的任务使用 CancellationToken 以确保它不超过您的执行时间限制。如果任务持续时间超过您的限制,您可以将任务配置为抛出异常
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多