首页 > 解决方案 > 我的线程函数以双倍参数运行

问题描述

我正在 foreach 循环上创建线程。

我为线程提供数组值和计数,并希望查看列表。

但是我的线程 [] 随机运行相同的计数参数。

此外, 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 一起工作太慢。

标签: c#multithreading

解决方案


这是一个很常见的问题,您需要为 count 创建一个专用变量以传递给委托/lambda

foreach (var item in VA)
{
    var count1 = count;
    T[count] = new Thread(delegate () { SetResultBox(count1, item); });
    T[count].Start();
    count++;
}

推荐阅读