我有一个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来创建新实例。但有人可以告诉我如何将文本的值从这里转移到线程吗?
答案 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();
}