作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个方法
public Task<Task> DoSomeWorkOnARemoteMachine()
它非常具有描述性,通过以下方式在远程机器上执行一些工作:
我使用 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/
我是一名优秀的程序员,十分优秀!