首先,为标题道歉;我真的想不出如何简洁地表达我想做的事情。
我有以下两个功能:
主要代码:
private async Task<PreparationInfo> PrepareRoundtrip()
{
PreparationInfo output = new PreparationInfo();
Task.Delay(3000); // stands in for a call to the server to fetch data for how to prepare
prepare(output) // package result into output
return output;
}
private Task ExecuteWithPrepare()
{
if (!PrepareEnabled) // instance variable
return stateObject.Execute();
else
{
Task<PreparationInfo> prepareTask = PrepareRoundtrip();
return tceTask.ContinueWith((prepareTaskInternal) =>
{
stateObject.Execute(); // this is the Task that I need to return
});
}
}
stateObject.Execute() header :
internal Task Execute()
{
...
}
我正在为 stateObject.Execute()
方法编写一个包装器,它可以选择调用一个准备方法 (PrepareRoundtrip()
),以便在执行之前预先处理一些参数.
如果未启用准备 (PrepareEnabled == false
),我可以直接调用 Execute()
方向并立即返回它返回的任务。如果启用了准备,我需要运行准备方法(这是此任务所特有的,我可以根据需要更改它),然后运行Execute()
。
我坚持的部分是:
整个函数需要像直接调用 stateObject.Execute()
一样运行并返回,只是添加了 PrepareRoundtrip()
部分,这意味着两件事:
从
ExecuteWithPrepare()
返回的任务需要代表stateObject.Execute()
返回的任务。ExecuteWithPrepare()
需要立即返回(即不等待PrepareRoundtrip()
中的 3 秒延迟)
实现此目标的最佳方法是什么?谢谢!
长话短说:
为 stateObject.Execute()
添加一个包装器以添加一个可能很长的额外准备步骤;需要整个过程立即返回代表原始结果的任务,而不是等待准备步骤先完成。
最佳答案
使用
Unwrap
转Task<Task>
(这就是你所拥有的)到Task
代表完成内部Task
,无需同步等待外部任务完成。只是
await
Task<Task>
两次,而不是一次,如果在async
中方法。
关于c# - 立即为在 ContinueWith block 内构建的调用调用任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27494389/