C# C语言中的多线程#

C# C语言中的多线程#,c#,multithreading,C#,Multithreading,我有一个c#windows窗体应用程序。现在它在单线程中运行良好。 下面是我如何通过点击按钮启动它 botThread = new Thread(new ThreadStart(mainThread)); botThread.Start(); 因此,一个线程被启动 用户将在文本框中指定一次要运行的线程数作为编号。 所以我希望启动多个线程,每个线程都应该从文本文件中获取一行。因此,如果线程是第一个,它应该得到文本文件的第一行 如果用户指定了两个线程,那么一旦线程的第一个实例结束执行任务或者它有任

我有一个c#windows窗体应用程序。现在它在单线程中运行良好。 下面是我如何通过点击按钮启动它

botThread = new Thread(new ThreadStart(mainThread));
botThread.Start();
因此,一个线程被启动

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

如果用户指定了两个线程,那么一旦线程的第一个实例结束执行任务或者它有任何期望,我希望bot移动到下一个实例,并使用文本文件的第三行启动一个新线程

我不知道该怎么办。我尝试使用for循环,但我无法跟踪线程,也无法在一个线程结束时启动新线程

编辑: 以下是循环代码:

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

            }
int j=int.Parse(设置\u文本框\u实例.Text);
对于(i=0;i
编辑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());

            } 
        }
private void多线程(int实例)
{
对于(i=0;i

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

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

//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();
            }
//如果线程处于活动状态,则返回true,否则返回false
botThread.IsAlive
int j=int.Parse(设置\文本框\实例.Text);
对于(i=0;i
您真的需要允许用户管理线程数吗

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

下面是一个简单的用法示例

 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文档之外,我强烈建议您阅读,以便更深入地理解这些概念。

您可以使用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));

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

是的,然后发布循环将其添加到我的第一篇文章中。请检查它,根据您的问题,您希望按顺序多任务处理应用程序。如果都是同步的,为什么要执行多线程?按上下文顺序多任务处理是不可能的。如果你想多任务处理,你可以并行处理任务。不连续(即一个接一个)。它不是控制台。我这里的主要问题是在控制台上多次启动线程。writeline只在那里有一个操作,您可以指定您自己的操作,无论需要对字符串执行什么处理。。。查看我的编辑。由于前一个进程处于活动状态,他将不会转到下一个进程。while循环确保进程仍然处于活动状态。您可以使用全局变量并放置文本行。当您完成处理时,您将从下一行开始。我提出了一个想法并更新了我的问题。你能帮我说一下如何将文本从我的功能转移到线程吗?对不起,我不知道第二部分的问题,但之前已经问过了,请参阅。
        Parallel.ForEach(l, new ParallelOptions {MaxDegreeOfParallelism = 10}, MyAction);

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