c# - 对 .Net 任务进行排序

标签 c# multithreading asynchronous .net-4.0

我有几个 Task对象,例如 Task<int> , Task<string> , Task<double> ,我想按顺序运行。也就是说,随着每个任务完成,下一个任务会自动启动。每个任务都依赖于前一个任务的输出。

我该怎么做呢? myTask.ContinueWith(...) 重载都假定一个委托(delegate)参数。但是 Task 不是委托(delegate)。

最佳答案

你可以这样做:

var t1 = new Task(() => Console.WriteLine("Completed t1"));
var t2 = new Task(() => Console.WriteLine("Completed t2"));
var t3 = new Task(() => Console.WriteLine("Completed t3"));

t1.ContinueWith(t => t2.RunSynchronously())
    .ContinueWith(t => t3.RunSynchronously());

t1.Start();



如果您不关心任务的结果,上面的示例仅适用。但是,如果您(如您的编辑状态)需要将每个任务的结果传递给下一个任务,那么您可以执行以下操作:

var t1 = new Task(() => Console.WriteLine("Completed t1"));
var t2 = new Task(() => Console.WriteLine("Completed t2"));
var t3 = new Task(() => Console.WriteLine("Completed t3"));

t1.ContinueWith(task1 =>
{
    Console.WriteLine(task1.Result);

    t2.ContinueWith(task2 =>
    {
        Console.WriteLine("{0} | {1}", task1.Result, task2.Result);

        t3.ContinueWith(task3 =>
        {
            Console.WriteLine("{0} | {1} | {2}", 
                task1.Result, task2.Result, task3.Result);
        });

        t3.Start();
    });

    t2.Start();
});

t1.Start();

/* OUTPUT:
Completed t1
Completed t1 | Completed t2
Completed t1 | Completed t2 | Completed t3 */

关于c# - 对 .Net 任务进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868613/

相关文章:

c# - 使用 C# 更新 Redis 中的值

c# - 使用 Open XML SDK c# 读取 excel

multithreading - 如何在 Rust 中进行 "fire and forget"调用?

c# - 多线程服务,BackgroundWorker vs ThreadPool?

c++ - 以固定速率重播存储的数据

node.js - Mocha,如何在没有UnhandledPromiseRejectionWarning的情况下测试异步代码

java - 在 @Async 函数完成之前返回值

javascript - JQuery 导出到 Excel 无法正常工作

c# - 在 wpf DataGrid 中单击 DataGridTemplateColumn 中的按钮时如何停止行选择

javascript - 组件通过 props 发送未定义的信息,因为它是在数据库查询结束之前安装的