【问题标题】:Start task, later wait for completion开始任务,稍后等待完成
【发布时间】:2020-03-15 04:08:36
【问题描述】:

我有一个非常密集的任务,我可以在函数的开头运行它,但我需要在函数的稍后位置得到结果。

该功能需要几秒钟才能完成,没有理由不让任务提前运行。在其间进行其他处理,然后等待更短的时间完成。

analyzer.Parse()Task<IAnalyzerResult>

analyzer = new ExprAnalyzer(expr);
//start the task
analyzer.Parse().Start();

// [...] Do other stuff

// Now I need analyzer.Parse() to have finished
IAnalyzerResult res = await analyzer.Parse() //this obviously doesn't work.

// [...] Process the result

如何开始一项任务,然后等待它在另一个时间点完成。简单地调用await analyzer.Parse(); 是不行的。

几年前我在某处读过如何做到这一点,但我再也无法在 Google 和 Stackoverflow 上找到任何东西了。

【问题讨论】:

  • Task<IAnalyzerResult> analyzerTask = analyzer.Parse().Start(); ... IAnalyzerResult res = await analyzerTask;
  • 请不要edit answers to change the results。如果您认为答案有问题,请发表评论。还有you're wrong

标签: c# asynchronous async-await task


【解决方案1】:

获取返回的Task:

Task<IAnalyzerResult> t = analyzer.Parse();

然后,等待结果:

IAnalyzerResult res = await t;

【讨论】:

  • 为了清楚所有的编辑:这里不仅不需要Start(),而且它会抛出一个InvalidOperationException,并带有消息“在promise-style任务上可能不会调用Start。 "试试看 :) 唯一需要调用 Start() 的时间是使用 new Task() 创建 Task
  • @GabrielLuci 我敢打赌ExprAnalyzer.Parse 会返回冷Task。 OP 似乎没有使用 async/await 和 TPL 的经验,所以他们可能不知道现在创建冷任务被认为是一种奇怪的事情。他们甚至可能不知道热任务和冷任务之间的区别。
  • @TheodorZoulias 非常正确。但是,是的,这样做会很奇怪。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 2021-08-14
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多