我的线程函数以双倍参数运行

时间:2019-01-24 08:17:56

标签: c# multithreading

我正在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中的作用太慢。

2 个答案:

答案 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++;
}