【发布时间】:2013-11-06 23:07:05
【问题描述】:
我有办法
public Task<Task> DoSomeWorkOnARemoteMachine()
非常描述性地,它通过以下方式在远程机器上执行一些工作:
- 在消息总线上排队消息,表明工作应该完成
- 远程代理接收消息并执行工作
- 工作完成,代理在消息总线上排队一条消息,表示工作已完成
- 调用工作的应用程序接收到工作完成的消息
之所以使用Task<Task>,是因为第一个Task<>是用于消息的排队;而内部Task 在远程机器上完成工作时完成(即当收到来自代理的消息时)。远程代理在执行工作期间捕获的任何异常都会与完成消息一起传递,并在内部 Task 完成时重新抛出。
调用这个方法我使用:
await await DoSomeWorkOnARemoteMachine();
它将等待消息排队以执行作业,以及完成作业并接收任何异常。但是,如果我对远程代理上的作业是否完成不感兴趣,我可以这样称呼它:
await DoSomeWorkOnARemoteMachine();
这不会是await 内部的Task。但是,内部的Task(它从远程代理接收消息,并重新抛出异常)仍然会在某个时候执行。我觉得这有点浪费,当我不await 获得结果时,我想避免执行它。
因此,我的问题是:Task 是否有可能“知道”它是否是 awaited,如果不是,则不执行,或者执行一些其他代码路径(例如空的 Task身体)。
我确实意识到我可以实现一些替代方案,例如传递“即发即弃”标志,或为“即发即弃”添加重载。如果我可以在不更改客户端 API 的情况下实现它,那就太好了
涉及实现这种远程工作执行的其他项目的答案也很棒!
【问题讨论】:
-
你几乎肯定不会想要这样做,即使你可以。如果后续任务被添加到该任务中,而不是立即添加会怎样。他们现在永远不会运行,因为任务永远不会完成。将任务粘贴到数据结构或字段中,然后再添加延续实际上是相当普遍的;这将使它们全部崩溃,但在一个非常混乱且难以调试的庄园中。
标签: c# asynchronous task-parallel-library async-await