对线程理论的疑惑

时间:2009-07-28 18:42:03

标签: c# multithreading

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

在我循环的那个循环中:

 ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
 new Thread(processTaskThread).Start();

我的问题是:这是否有效,或者我是否需要编写代码,以便使用唯一变量名声明线程?

2 个答案:

答案 0 :(得分:8)

您无需为其指定唯一名称。你需要确保它们在完成后得到清理,而你需要确保如果有什么变化可以发送10,000条记录,而不是只发送10条记录不要尝试创建10,000个线程。一种方法是通过QueueUserWorkItem()函数。

答案 1 :(得分:5)

你没有显示循环,那是至关重要的。例如,这被打破了:

foreach (Foo myParam in parameters)
{
    ThreadStart processTaskThread = delegate { ProcessTasks(myParam ); };
    new Thread(processTaskThread).Start();
}

但这没关系:破碎:

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();
}

在第一个版本中,正在捕获myParam变量,并且只有一个变量。在第二个版本中,循环的每次迭代都有一个新的变量“实例”。有关详细信息,请参阅我的article on closures

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

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();
        }
    }
}

十次打印“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();
        }
    }
}