对线程理论的疑惑

JL.*_*JL. 1 c# multithreading

我有一个可以包含1-10条记录的循环....

在我循环的那个循环中:

 ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
 new Thread(processTaskThread).Start();
Run Code Online (Sandbox Code Playgroud)

我的问题是:这会工作,还是我需要编写代码,以便使用唯一的变量名声明线程?

Joe*_*orn 8

您不需要为它们指定唯一的名称.你确实需要确保它们在完成时被清理干净,你确实需要确保如果有什么变化可以发送10,000个记录而不是10个你不会尝试创建10,000个线程的记录.一种方法是通过QueueUserWorkItem()函数.

  • 你完成后不需要清理线程 - 至少除非你特别做需要清理的事情. (3认同)

Jon*_*eet 5

你没有展示循环,这是至关重要的.例如,这是破碎的:

foreach (Foo myParam in parameters)
{
    ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
    new Thread(processTaskThread).Start();
}
Run Code Online (Sandbox Code Playgroud)

但这没关系:破碎:

foreach (Foo myParam in parameters)
{
    Foo copy = myParam; // This line is crucial

    // Then we use the new variable in the anonymous method
    ThreadStart processTaskThread = delegate { ProcessTasks(copy); };
    new Thread(processTaskThread).Start();
}
Run Code Online (Sandbox Code Playgroud)

在第一个版本中,myParam正在捕获变量,并且只有一个变量.在第二个版本中,循环的每次迭代都有一个新的变量"实例".有关更多信息,请参阅我关于闭包的文章.

请注意,这不需要线程来演示该问题.这是一个不使用任何线程的示例:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<Action> actions = new List<Action>();
        for (int i=0; i < 10; i++)
        {
            actions.Add(delegate { Console.WriteLine(i); });
        }

        foreach (Action action in actions)
        {
            action();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

打印"10"十次.这是固定版本:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<Action> actions = new List<Action>();
        for (int i=0; i < 10; i++)
        {
            int copy = i;
            actions.Add(delegate { Console.WriteLine(copy); });
        }

        foreach (Action action in actions)
        {
            action();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)