c# - 立即为在 ContinueWith block 内构建的调用调用任务?

标签 c# .net task

首先,为标题道歉;我真的想不出如何简洁地表达我想做的事情。

我有以下两个功能:

主要代码:

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() 部分,这意味着两件事:

  1. ExecuteWithPrepare() 返回的任务需要代表 stateObject.Execute() 返回的任务。

  2. ExecuteWithPrepare() 需要立即返回(即等待 PrepareRoundtrip() 中的 3 秒延迟)

实现此目标的最佳方法是什么?谢谢!

长话短说:

stateObject.Execute() 添加一个包装器以添加一个可能很长的额外准备步骤;需要整个过程立即返回代表原始结果的任务,而不是等待准备步骤先完成。

最佳答案

  1. 使用 UnwrapTask<Task> (这就是你所拥有的)到 Task代表完成内部Task ,无需同步等待外部任务完成。

  2. 只是await Task<Task>两次,而不是一次,如果在 async 中方法。

关于c# - 立即为在 ContinueWith block 内构建的调用调用任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27494389/

相关文章:

ios - 如何将 NSURLRequest 的结果传回包含类

ios - 等待 session.dataTask 上的任务返回

c# - Virtual Piano UWP C# 中的黑键实现

c# - 来自数据绑定(bind)的 WPF MVVM 表布局

c# - 将 gridview 数据导出到 CSV 文件

c# - 这是异步调用同步方法的正确方法吗?

c# - AppFabric 缓存服务器复制

c# - Lucene.net 无法搜索 ".net"

.net - 为什么在 .Net 中使用异步编程模型不会导致 StackOverflow 异常?

c# - Winforms中如何设置自定义控件中Colors的默认值?