c# - 多线程单个重复任务
问题描述
我有一个控制台应用程序,它从 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"); }}
解决方案
您可以滥用 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 继续处理直到第一个有效结果。
推荐阅读
- oracle - 将参数值返回到 VBScript
- xamarin - Xamarin.Mac 在使用 NSSavePanel 时显示默认文件名
- java - 使用 DnD 骰子滚轮的循环将变量添加到数组
- haskell - 递归列表时出现非详尽模式错误
- html - 使用“stylePreprocessorOptions”时找不到要导入的文件或无法读取的问题
- javascript - 如何重新渲染 Web 组件的单个元素?
- c - 具有嵌套 .h 文件的项目的生成文件
- python - 断言失败) !_src.empty() 在函数'cv::cvtColor
- xml - 在 Biztalk 2016 中将文档路由到多个接收者
- python - 将 pandas 数据框转换为自定义的 json