我正在尝试创建一个C#工具,用户可以在其中选择他希望工具同时执行的线程数。 例如,他在threadsTextBox中放了“10”,所以当他点击startButton时,程序将启动并同时在10个线程上执行所需的任务。
以下是我对3个线程的当前代码,但我不知道如何让用户能够选择他希望程序使用多少个线程。
static void Main(string[] args)
{
Task task1 = Task.Factory.StartNew(() => doStuff());
Task task2 = Task.Factory.StartNew(() => doStuff());
Task task3 = Task.Factory.StartNew(() => doStuff());
Task.WaitAll(task1, task2, task3);
Console.WriteLine("Done !");
}
static void doStuff()
{
// do stuff here
}
提前致谢。
答案 0 :(得分:2)
这似乎是数组的理想用法:
static void Main(string[] args) {
var tasks = new Task[n];
for (int j1 = 0; j1 < n; ++j1)
tasks[j1] = Task.Factory.StartNew(() => doStuff());
Task.WaitAll(tasks);
Console.WriteLine("Done !");
}
答案 1 :(得分:0)
最简单的方法是允许用户输入线程数作为命令行参数。
int numberOfThreads = int.Parse(args[0]);
在这个例子中,我使用Enum.Range
生成具有正确数量元素的IEnumerable,然后使用LINQ来启动任务。
static void Main(string[] args)
{
int numberOfThreads = int.Parse(args[0]);
Task.WaitAll(
Enum.Range(0, numberOfThreads)
.Select(
Task.Factory.StartNew(() => doStuff())
)
.ToArray()
)
);
Console.WriteLine("Done !");
}
或者您可以使用Parallel.For
,具体取决于您是否真的需要这些任务。
static void Main(string[] args)
{
int numberOfThreads = int.Parse(args[0]);
Parallel.For(1, numberOfThreads, (i) => doStuff());
Console.WriteLine("Done !");
}
如果您需要更多迭代但希望限制线程数,则可以使用ParallelOptions。在这个例子中,我允许100次迭代,但只使用用户指定的线程数。
static void Main(string[] args)
{
int numberOfThreads = int.Parse(args[0]);
Parallel.For(
1,
100,
new ParallelOptions
{
MaxDegreeOfParallelism = numberOfThreads
},
(i) => doStuff()
);
Console.WriteLine("Done !");
}
答案 2 :(得分:-1)
也许你应该使用一个具有用户想要的长度的数组,你只需使用Task.Factory.StartNew(())初始化数组的每个元素; ?希望这有点帮助^^