我正在尝试同时启动多个线程,但它无法正常工作。继承我的代码:
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
至于输出,第一个数字表示从哪里开始下载一个文件,第二个数字表示完成的位置(以字节为单位) 如何使用我分配给它的参数启动列表中的每个线程?我迷路了,所以任何帮助都会很棒。谢谢!
答案 0 :(得分:2)
你的lambda表达式() => Download(URL, previous, i)
正在捕获循环变量i
。它不是捕获的值,而是变量本身。因此,在执行Download
调用时,i
可能已经发生了变化。 previous
变量存在同样的问题,它也在循环的迭代之间共享。
修复是在循环中声明变量 ,将i
的值复制到它,并在lambda中使用该变量(对{{1}执行相同的操作})。
previous
有关更完整的说明,请参阅this article by Eric Lippert。