当前位置: 首页 > 知识库问答 >
问题:

如何将任务结果传递给不使用延续的其他任务

田德运
2023-03-14

func 类型中定义了不同数量的任务,因此可以定义任务,但不能自动启动。例如说:

Func<Task> task1Func = () => DoTask1Async();

以这种方式定义的一些任务返回值。我需要一种方法来‘传递’这些任务的结果到后续任务的参数,以同样的方式定义。所以,我想写:

Func<Task> task2Func = () => DoTask2Async(task1Func.Invoke().Result));
Func<Task> funcTasks = () => DoTask1Async().ContinueWith(t => DoTask2Async(t.Result));

任务按定义的顺序处理,每个任务在处理下一个任务之前完成。任务的结果仅用于后续任务。

在使用task1func.invoke().result响应对可运行代码的请求时,如下所示。创建一个新的WPF项目,并将一个按钮添加到默认网格中。然后清除mainWindow.xaml.cs文件并粘贴到下面的内容中。这是最接近我的真实项目的代码,同时删去了所有与问题无关的东西。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApplication2
{

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        // Declare first task that returns a result
        Func<Task<int>> deferredTask1 = () => DoTask1Async();
        // Declare second task using result of first.
        // BUT this isn't good as it calls deferredTask1 AGAIN, so need another approach.
        Func<Task> deferredTask2 = () => DoTask2Async(deferredTask1.Invoke().Result);

        var item1 = new MyItem() { MyDeferredTask = deferredTask1 };
        var item2 = new MyItem() { MyDeferredTask = deferredTask2 };

        List<MyItem> items = new List<MyItem>();

        items.Add(item1);
        items.Add(item2);

        await DoTasksAsync(items);

    }

    public static async Task<int> DoTask1Async()
    {
        return await Task<int>.Run(() => { return 3000; });
    }

    public static async Task DoTask2Async(int delay)
    {
        await Task.Delay(delay);
    }

    private async Task DoTasksAsync(IEnumerable<MyItem> items)
    {
        foreach (var item in items)
        {
            await item.MyDeferredTask();
        }
    }

    private class MyItem
    {
        public Func<Task> MyDeferredTask { get; set; }
    }
}
}

共有1个答案

冷英光
2023-03-14

使用Microsoft的Reactive框架,您可以这样做:

var query =
    from r1 in Observable.FromAsync(() => DoTask1Async())
    from r2 in Observable.FromAsync(() => DoTask2Async(r1))
    select new { r1, r2 };

await query;
 类似资料:
  • A task is special because knowing when a task is about to exit is useful in these circumstances: Frameworks know when to render the UI. Measuring enter/leave allows knowing total script/task time. Exi

  • 7.15. 其他任务 这里有一些简单的任务,你可以自己解决: 把模板文件存放在tmpl/目录,页面数据存放在data/目录。 增加一个处理函数(handler),将对根目录的请求重定向到/view/FrontPage。 修饰页面模板,使其成为有效的HTML文件。添加CSS规则。 实现页内链接。将[PageName]修改为<a href="/view/PageName">PageName</a>。(

  • 我使用部署到pivotal cloud foundry的spring云数据流,将spring批处理作业作为spring云任务运行,这些作业需要aws凭据才能访问s3存储桶。 我尝试将aws凭据作为任务属性传递,但凭据作为参数或属性显示在任务的日志文件中。(https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/html

  • 问题内容: 我有一个运行自定义gradle任务的Java应用程序,该应用程序在被调用时需要一些参数。这些是: Gradle任务如下所示: 我已尝试运行,但无法正常工作。 问题答案: 从Gradle 4.9开始,可以使用–args传递命令行参数。例如,如果要使用命令行参数启动应用程序,则可以使用 gradle run –args =’foo –bar’ 另请参阅Gradle应用程序插件 如何升级Gr

  • 问题内容: 该文档讨论了使用numba的作为的参数。我需要带有附加参数的相同内容。 我基本上是想做这样的事情: 但是,它不起作用,因为应该是/并且不能将它们转换为。我收到以下错误消息: 我没有找到有关如何从Numba中提取值的任何信息。在C语言中,应该类似于—在Numba中可以做同样的事情吗? 问题答案: 1.通过传递额外的参数 该文件说: 如果用户希望改善集成性能,则可以使用以下签名之一: 该是

  • 问题内容: 我在task.py中有一个任务,如下所示: 我试图将请求对象直接从几个传递给任务,如下所示: 我收到一个无法序列化的错误,我猜是吗?我该如何解决?麻烦的是我也有文件上传对象..它不是所有简单的数据类型。 问题答案: 因为请求对象包含对不实际序列化的内容的引用(例如上载的文件或与请求关联的套接字),所以没有通用的方法来对其进行序列化。 相反,您应该拔出并传递需要的部分。例如,类似: