如何启动线程异步?

时间:2015-04-24 00:14:40

标签: c# multithreading download lambda

我正在尝试同时启动多个线程,但它无法正常工作。继承我的代码:

        var previous = 0;

        var threadList = new List<Thread> {};
        for (var i = (int)partSize; i <= responseLength; i = i + (int)partSize)
        {
            var t = new Thread(() => Download(URL, previous, i));
            //t.Name = i.ToString();
            threadList.Add(t);
            //t.Start();
            //t.Join(300);
            //new Thread(() => {Download(URL,previous, i);}).Start();
            //var t = Task.Factory.StartNew(() => Download(URL, previous, i));

            previous = i;
        }

        foreach (Thread t in threadList)
        {
            //Console.WriteLine(t.Name);
            t.Start();
        }

输出:

77296,86958
77296,86958
77296,86958
77296,86958
77296,86958
77296,86958
77296,86958
77296,86958

显示一段时间后,它会挂起并最终崩溃。

使用不同代码的预期输出:

        for (var i = (int)partSize; i <= responseLength; i = i + (int)partSize)
        {
            var copy = previous;
            var t = new Thread(() => Download(URL, copy, i));
            t.Start();
            t.Join();

            previous = i;
        }

输出:

0,9662
9662,19324
19324,28986
28986,38648
38648,48310
48310,57972
57972,67634
67634,77296

至于输出,第一个数字表示从哪里开始下载一个文件,第二个数字表示完成的位置(以字节为单位) 如何使用我分配给它的参数启动列表中的每个线程?我迷路了,所以任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:2)

你的lambda表达式() => Download(URL, previous, i)正在捕获循环变量i。它不是捕获的值,而是变量本身。因此,在执行Download调用时,i可能已经发生了变化。 previous变量存在同样的问题,它也在循环的迭代之间共享。

修复是在循环中声明变量 ,将i的值复制到它,并在lambda中使用该变量(对{{1}执行相同的操作})。

previous

有关更完整的说明,请参阅this article by Eric Lippert