gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:10:08 31 4
gpt4 key购买 nike

我有一个方法

public Task<Task> DoSomeWorkOnARemoteMachine()

它非常具有描述性,通过以下方式在远程机器上执行一些工作:

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

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

要调用此方法,我使用:

await await DoSomeWorkOnARemoteMachine();

这将等待消息排队以执行作业,以及完成作业并接收任何异常。但是,如果我对作业是否在远程代理上完成不感兴趣,我可能会这样调用它:

await DoSomeWorkOnARemoteMachine();

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

因此我的问题是:Task 是否可能? “知道”它是否正在 await如果不是,则不执行,或者执行其他代码路径(例如空的 Task 主体)。

我确实意识到我可以实现替代方案,例如传递“即发即弃”标志,或为“即发即弃”添加重载。如果我可以在不更改客户端 API 的情况下实现它,那就太好了

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

最佳答案

我不认为它可以轻松或有效地实现(使用 Task.GetAwaiter 是一个坏主意,并且无法从您的函数内部访问它,请参阅 Noseratio 的回答)。这是替代解决方案:

解决方案 n°1:Task 执行的函数参数

await DoSomeWorkOnARemoteMachine(false) //Indicates that DoSomeWork shouldn't be executed

解决方案 n°2:显式任务执行

Task t = await DoSomeWorkOnARemoteMachine() ;
t.Start(); // For example, if you want to execute the resulting Task.
// You can also dispatch it to an other thread, etc...

关于c# - 有没有办法知道是否正在等待任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19806664/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com