首页 > 解决方案 > 多线程单个重复任务

问题描述

我有一个控制台应用程序,它从 n 条线索中生成(解决)一个有效的数独谜题,但我目前设置它的方式是一遍又一遍地调用我的方法,直到找到有效的解决方案。当想要一遍又一遍地运行相同的功能时,这是实现多线程的正确方法吗?或者是他们的另一种更好的方式。感谢任何帮助!

*GenerateBoard() 返回一个多维数组

bool valid = false;

while (valid == false)
            {
            var task1 = Task.Factory.StartNew(() => GenerateBoard());
            var one = ValidateSolution(task1.Result);
            if (one) { valid = true; } else { Console.WriteLine("Task1 trying again"); }

            var task2 = Task.Factory.StartNew(() => GenerateBoard());
            var two = ValidateSolution(task2.Result);
            if (two) { valid = true; } else { Console.WriteLine("Task2 trying again"); }

            var task3 = Task.Factory.StartNew(() => GenerateBoard());
            var three = ValidateSolution(task3.Result);
            if (three) { valid = true; } else { Console.WriteLine("Task3 trying again"); }

            var task4 = Task.Factory.StartNew(() => GenerateBoard());
            var four = ValidateSolution(task4.Result);
            if (four) { valid = true; } else { Console.WriteLine("Task4 trying again"); }}

标签: c#multithreading

解决方案


您可以滥用 Parallel Linq 来并行搜索您的解决方案:

IEnumerable<object> InfiniteEnumerable()
{
    while (true) yield return null;
}

var result = InfiniteEnumerable()
    .AsParallel()
    .Select(_ => GenerateBoard())
    .WithMergeOptions(ParallelMergeOptions.NotBuffered)
    .AsSequential()
    .First(ValidateSolution);

这将自动为您的硬件使用最佳线程数。

.WithMergeOptions(ParallelMergeOptions.NotBuffered)和对于.AsSequential()确保在找到第一个解决方案后立即停止处理很重要。至于InfiniteEnumerable(),我不知道是否有更聪明的方法来告诉 PLinq 继续处理直到第一个有效结果。


推荐阅读