我正在foreach循环上创建线程。
我提供线程的数组值和计数,并希望查看列表。
但是我的thread []随机以相同的count参数运行。
此外,T [0]不会正常终止。我想这也是argu重叠的问题。
这使得结果面板可以放置在其他面板上。
Thread[] T = new Thread[VA.Count];
int count = 0;
ThreadEnd = new CountdownEvent(VA.Count);
foreach (var item in VA)
{
T[count] = new Thread(delegate () { SetResultBox(count, item); });
T[count].Start();
count++;
}
ThreadEnd.Wait();
private void SetResultBox(int RunCount, JToken item)
{
VideoJson videoinfo = new VideoJson();
videoinfo.title = item["snippet"]["title"].ToString();
videoinfo.description = item["snippet"]["description"].ToString();
videoinfo.ThumbnailURL = item["snippet"]["url"].ToString();
VideoArray.Add(videoinfo);
SearchResultControl SRC = new SearchResultControl(videoinfo);
SRC.Location = new Point(0, RunCount * 110);
ResultControlList.Add(SRC);
ThreadEnd.Signal();
}
我想知道SetResultBox函数的参数为什么会重叠。
重要的是,我希望没有Join方法。
如果VA数组变大,则此函数在Join Func中的作用太慢。
答案 0 :(得分:0)
这是一个非常常见的问题,您需要创建一个专用的变量以供count传递给委托/ lambda
foreach (var item in VA)
{
var count1 = count;
T[count] = new Thread(delegate () { SetResultBox(count1, item); });
T[count].Start();
count++;
}
答案 1 :(得分:0)
您正在隐式捕获count
的上下文,从而使线程使用线程实际开始执行此工作时出现的count
的值。我猜想foreach
循环的迭代速度要比Thread
实际启动的速度快。声明一个局部变量,该变量将使您立即复制该值,并且可以正常运行:
foreach (var item in VA)
{
var currentCount = count;
T[count] = new Thread(delegate () { SetResultBox(currentCount, item); });
T[count].Start();
count++;
}