C#中的多线程

时间:2014-04-09 09:21:00

标签: c# multithreading

我有一个c# Windows窗体应用。现在它在单线程中单独工作。 以下是我点击按钮启动它的方法。

botThread = new Thread(new ThreadStart(mainThread));
botThread.Start();

所以一个线程就会启动。

用户将在文本框中一次指定要运行的线程数作为数字。 所以我希望启动许多线程,每个线程都应该从文本文件中获取一行。所以如果线程是第一个,它应该得到文本文件的第一行。

如果用户指定了两个线程,一旦线程的第一个实例结束执行该作业或者它有任何期望,我希望机器人移动到下一个实例并使用第3行文本文件启动一个新线程。 / p>

我不知道该怎么做。我尝试使用for循环,但我无法跟踪线程,并且当一个结束时无法启动新的

编辑: 这是循环代码:

int j = int.Parse(settings_textbox_instances.Text);
            for (i = 0; i < j; i++)
            {
                botThread = new Thread(new ThreadStart(mainThread));
                botThread.Start();

            }

编辑1:

我使用过代码并制作了这个。

private void multiThreader(int instances)
        {

            for (i = 0; i < instances; i++)
            {
                botThread = new Thread(new ThreadStart(mainThread));
                string text = this.users_List[this.i];


                botThread.Start();

                threadcount++;
                MessageBox.Show(i.ToString());

            } 
        }

所以当结束线程时,我可以调用void来创建新实例。但有人可以告诉我如何将文本的值从这里转移到线程吗?

3 个答案:

答案 0 :(得分:1)

您真的需要允许用户管理线程数吗?

您可以让框架处理细节并使用Task Parallel Library

以下是一个简单的使用示例...

 static void Main()
{
    var lines = System.IO.File.ReadAllLines(@"c:\temp\log.txt");
    Parallel.ForEach(lines,line => processLine(line));
}

private static void processLine(string line)
{
    Console.WriteLine(line);
}

除了上面链接的TPL文档之外,我强烈建议您阅读Joe Albaharis excellent series on Threading in C#以更深入地理解这些概念。

答案 1 :(得分:1)

您可以使用Parallel.ForEach

        var l = new List<string>();
        using (var fs = new FileStream("", FileMode.Open, FileAccess.Read))
        {
            using (var sr = new StreamReader(fs))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    l.Add(line);
                }
            }
        }
        Parallel.ForEach(l, new ParallelOptions {MaxDegreeOfParallelism = 10}, line => Console.WriteLine(line));

为了清晰起见

        Parallel.ForEach(l, new ParallelOptions {MaxDegreeOfParallelism = 10}, MyAction);

    private void MyAction(string s)
    {
        throw new NotImplementedException();
    }

MaxDegreeOfParallelism将是文本框提供的数字。

答案 2 :(得分:0)

您可以在代码中使用此函数来查看何时启动另一个线程:

//return true if the thread is alive else false
botThread.IsAlive



int j = int.Parse(settings_textbox_instances.Text);
            for (i = 0; i < j; i++)
            {
                botThread = new Thread(new ThreadStart(mainThread));
                botThread.Start();
                while (botThread.IsAlive)
                {}
                botThread2 = new Thread(new ThreadStart(mainThread));
                botThread2.Start();
            }