我有一个方法
public Task<Task> DoSomeWorkOnARemoteMachine()
非常具有描述性地,它通过以下方式在远程机器上执行一些工作:
- 在消息总线上排队消息,表明工作应该完成
- 远程代理接收消息并执行工作
- 工作完成,代理在消息总线上排队一条消息,表示工作已完成
- 调用工作的应用程序接收到工作完成的消息
我使用的原因Task<Task>
是因为第一个Task<>
是为了消息的排队;而Task
当远程机器上的工作完成时(即收到代理的消息时),内部完成。远程代理在执行工作期间捕获的任何异常都会与完成消息一起传递,并在内部完成时重新抛出Task
。
要调用此方法,我使用:
await await DoSomeWorkOnARemoteMachine();
这将等待消息排队执行作业,以及完成作业并接收任何异常。但是,如果我对远程代理上的作业是否完成不感兴趣,我可以这样称呼它:
await DoSomeWorkOnARemoteMachine();
这不会await
是内在的Task
。但是,内部Task
(从远程代理接收消息并重新抛出异常)仍会在某个时候执行。我觉得这有点浪费,我想避免在我不await
考虑结果时执行它。
因此,我的问题是:a 是否有可能Task
“知道”它是否正在被await
编辑并且如果不是则不执行,或者执行一些其他代码路径(例如空Task
主体)。
我确实意识到我可以实现一些替代方案,例如传递“即发即弃”标志,或为“即发即弃”添加重载。如果我可以在不更改客户端 API 的情况下实现它,那就太好了
涉及实现这种远程工作执行的其他项目的答案也很棒!