异步任务仅在列表中运行最后一个任务

时间:2016-06-03 13:50:33

标签: c# multithreading task-parallel-library

我试图了解如何更好地利用.Net 4.5 TPL。传统上我习惯用老派的方式管理线程,直接排队和管理线程。

我创建了一个讨论TPL的愚蠢程序,但是,代码似乎只执行添加到我的任务列表中的最后一个任务 - 我无法确定原因:

class Program {
    static void Main(string[] args) {

        var a = new A();
        var b = new B();

        var tasks = new List<Task<string>>();
        for (int j = 33; j < 64; j++) {
            tasks.Add(Task.Run(() => a.Go(j, 20)).ContinueWith((i) => b.Do(i)));
        }
        var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), r => {
            foreach (var t in r)
                Console.Write(t.Result);
        });

        finalTask.Wait();

        Console.WriteLine("Finished.");
        Console.ReadLine();

    }
}

public class A {
    public int Go(int chr, int loops) {
        for (int i = 0; i < loops; i++) {
            Thread.Sleep(10);
            Console.Write((char)chr);
        }
        return loops;
    }
}

public class B {
    public string Do(Task<int> value) {
        string s = "";
        for (int i = 0; i < value.Result; i++) {
            s = s + "a";
        }
        return s;
    }
}

为什么其他线程不执行的任何想法?

1 个答案:

答案 0 :(得分:2)

您必须在闭包上下文中捕获正在运行的变量j

for (int j = 33; j < 64; j++) {
        var num = j;
        tasks.Add(Task.Run(() => a.Go(num, 20)).ContinueWith((i) => b.Do(i)));
    }

另见Captured variable in a loop in C#