我有一个方法
public Task<Task> DoSomeWorkOnARemoteMachine()
这段代码很形象地描述了如何在远程机器上执行一些工作:
- 在消息总线上排队一个消息,表示需要完成工作
- 远程代理获取该消息并执行工作
- 工作完成后,代理在消息总线上排队一个消息,表示工作已完成
- 调用该工作的应用程序获取工作已完成的消息
我使用 Task<Task>
的原因是,第一个 Task<>
用于排队消息;而内部的 Task
在远程机器上的工作完成时完成(即代理接收到消息时)。远程代理在执行工作期间捕获的任何异常都会随着完成消息一起传递,并在内部的 Task
完成时重新抛出。
要调用此方法,可以使用:
await await DoSomeWorkOnARemoteMachine();
如果我不关心工作程序是否在远程代理上完成,我可以按照以下方式调用它:这会等待消息排队以执行任务,以及完成任务并接收任何异常。
await DoSomeWorkOnARemoteMachine();
如何完成一个不会 await
内部 Task
的函数,但是内部的 Task
(负责接收来自远程代理的消息并重新抛出异常)仍然会在某个时刻执行。我认为这有点浪费,希望在没有等待结果时能避免其执行。
我的问题是:是否可能让一个Task
“知道”它是否被await
并在未被await
时不执行或者执行其他代码路径(比如空的Task
体)。
我确实意识到可以采用其他方法来实现此目的,例如传递“fire and forget”标志或添加“fire and forget”重载。但如果能够在不更改客户端API的情况下实现这一点,那将是很好的。
涉及实现此类远程工作执行的其他项目的答案也非常棒!