有没有办法知道是否正在等待任务?

fli*_*art 10 c# asynchronous task-parallel-library async-await

我有一个方法

public Task<Task> DoSomeWorkOnARemoteMachine()
Run Code Online (Sandbox Code Playgroud)

这非常具有描述性,通过以下方式在远程计算机上执行某些工作:

  1. 在消息总线上排队消息,表明应该完成工作
  2. 远程代理接收消息并执行工作
  3. 工作完成,代理在消息总线上对消息进行排队,表示工作已完成
  4. 调用工作的应用程序会收到工作完成的消息

我使用的原因Task<Task>是因为第一个Task<>是排队消息; 当在Task远程机器上完成工作时(即,当收到来自代理的消息时),内部完成.远程代理在执行工作期间捕获的任何异常都将与完成消息一起传递,并在内部Task完成时重新抛出.

要调用此方法,我使用:

await await DoSomeWorkOnARemoteMachine();
Run Code Online (Sandbox Code Playgroud)

等待消息排队等待执行作业,以及完成作业并接收任何异常.但是,如果我对是否在远程代理上完成作业不感兴趣,我可以将其称为如下:

await DoSomeWorkOnARemoteMachine();
Run Code Online (Sandbox Code Playgroud)

这不是await内心的Task.但是,内部Task(从远程代理接收消息,并重新抛出异常)仍然会在某个时刻执行.我觉得这有点浪费,我不想在没有await结果时执行它.

因此我的问题是:是否有可能Task"知道"它是否被await编辑而不是执行,如果不是,或执行一些其他代码路径(例如空Task体).

我确实意识到我可以实现的替代方案,例如传递"fire and forget"标志,或者为"fire and forget"添加重载.如果我可以在没有客户端API更改的情况下实现它,那将是很棒的

涉及实现这种远程工作执行的其他项目的答案也会很棒!

svi*_*ick 2

我认为你这样做的方式很令人困惑。根本不清楚 到底Task<Task>是什么意思。我要做的是让你的方法返回类似Task<Work>. 然后,该Work类型将具有类似 的方法GetResultAsync(),该方法将返回Task表示远程计算机上工作执行情况的 。

这样,您的代码就具有更清晰的含义,并且您还可以根据是否GetResultAsync()被调用轻松识别是否处理响应。