【问题标题】:Regarding running multiple task & report when complete关于运行多个任务并在完成时报告
【发布时间】:2013-11-18 21:57:52
【问题描述】:

我一直在寻找出路,运行多个任务并不按顺序报告任务状态。 在这里,我粘贴了一个代码,其中多个任务正在运行并在所有任务完成时报告。

var task1 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(1000);
                return "dummy value 1";
            });

            var task2 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(13000);
                return "dummy value 2";
            });

            var task3 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(2000);
                return "dummy value 3";
            });

            Task.Factory.ContinueWhenAll(new[] { task1, task2, task3 }, tasks =>
            {
                foreach (Task<string> task in tasks)
                {
                    Console.WriteLine(task.Result);
                }
            });
            Console.ReadLine();

task1 将花费更少的时间,然后 task3 将完成,最后一个 task2 将完成,但ContinueWhenAll 始终显示 task1 已完成,然后是 task2 & task3。我想以这样的方式修改代码,结果哪个任务完成速度很快,首先显示的不是顺序。在哪里更改代码。请指导。谢谢

更新

var taskp = Task.Factory.StartNew(() =>
            {
                var task1 = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(1000);
                    return "Task1 finished";
                }).ContinueWith((continuation) => { Console.WriteLine(continuation.Result); });

                var task2 = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(3000);
                    return "Task2 finished";
                }).ContinueWith((continuation) => { Console.WriteLine(continuation.Result); });

                var task3 = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(2000);
                    return "Task3 finished";
                }).ContinueWith((continuation) => { Console.WriteLine(continuation.Result); });

                return "Main Task finished";
            });


            taskp.ContinueWith(t => Console.WriteLine(t.Result));
            Console.ReadLine();

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

    一个简单的解决方案是 ContinueWith 每个任务,单独。这是一个非常快速和肮脏的例子:

    var taskp = Task.Factory.StartNew(() =>
    {
        var task1 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            return "dummy value 1";
        }).ContinueWith((continuation) => { Console.WriteLine("task1"); });
    
        var task2 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(3000);
            return "dummy value 2";
        }).ContinueWith((continuation) => { Console.WriteLine("task2"); });
    
        var task3 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(2000);
            return "dummy value 3";
        }).ContinueWith((continuation) => { Console.WriteLine("task3"); });
    
        Task.Factory.ContinueWhenAll(new Task[] { task1, task2, task3}, (x) => { Console.WriteLine("Main Task Complete"); });
    });            
    

    代码已更新以适应 OP 的 UPDATE,在所有“内部”任务完成后将输出一个“主”任务。为了使taskp返回字符串而不是写它,代码变成了

    var taskp = Task.Factory.StartNew<string>(() =>
    {
        var task1 = ...; //same
        var task2 = ...; //same
        var task3 = ...; //same
        return "Main Task Complete";
    
    }).ContinueWith((x)=> Console.WriteLine(x.Result));
    

    必须使用StartNew&lt;&gt; 重载来指定Task 的返回类型以具有Result

    【讨论】:

    • 我有点改变你的代码,但这一行给出了错误。 }).ContinueWith((x) => x.Result);错误是“不包含'结果'的定义”在这里我更新了我的代码......请看看并指导我在哪里犯了错误?
    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 2013-11-28
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多