让用户选择他想要的线程数?

时间:2017-11-08 23:51:27

标签: c# multithreading

我正在尝试创建一个C#工具,用户可以在其中选择他希望工具同时执行的线程数。 例如,他在threadsT​​extBox中放了“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
}

提前致谢。

3 个答案:

答案 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(())初始化数组的每个元素; ?希望这有点帮助^^