开始任务,稍后等待完成

3

我有一个非常繁重的任务,可以在函数开始时运行,但稍后在函数中需要结果。

该函数需要几秒钟才能完成,因此没有理由不让任务尽早运行。在之间进行其他处理,以便稍后更短时间等待完成。

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 上无法找到任何相关内容了。


2
Task<IAnalyzerResult> analyzerTask = analyzer.Parse().Start(); ... IAnalyzerResult res = await analyzerTask; - Fildor
2
请勿更改答案以更改结果。如果您认为答案存在问题,请写下评论。同时,你是错误的。 - Liam
1个回答

6

获取返回的任务:

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

然后,等待它的结果:

IAnalyzerResult res = await t;

3
为了澄清所有的修改:这里不仅Start()是不必要的,而且它会抛出一个异常,错误信息为“不能在promise-style任务上调用Start()”。你可以试试看 :) 只有当你使用new Task()创建任务时才需要调用Start() - Gabriel Luci
@GabrielLuci 我敢打赌 ExprAnalyzer.Parse 返回的是一个冷的 Task。OP 似乎对异步/等待和 TPL 不太熟悉,所以他们可能不知道现在创建冷任务被认为是一种奇怪的做法。他们甚至可能不知道热任务和冷任务之间的区别。 - Theodor Zoulias
@TheodorZoulias 非常正确。但是,这将是一件奇怪的事情。 - Gabriel Luci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接