Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动并行化策略_C#_Multithreading_Algorithm_Parallel Processing - Fatal编程技术网

C# 自动并行化策略

C# 自动并行化策略,c#,multithreading,algorithm,parallel-processing,C#,Multithreading,Algorithm,Parallel Processing,我正在构建一个基于节点的拖放编辑器,其中每个节点表示一个操作(例如,读取此文件或对此数据进行排序等)。可以连接节点的输出和输入 我想实现的一个特性是,如果路径分支了,我可以自动开始一个线程来处理每个分支。然而,我关心几个问题: 如果一条路径分支了,但后来又重新连接在一起,我将需要以某种方式对它们进行同步 如果有多个开始节点(执行开始的地方),则必须单独管理它们的路径,然后可能动态地加入/合并 我想限制创建的线程数量,这样我就不会突然有20个线程死锁 本质上,我想知道是否存在这样做的策略(不一

我正在构建一个基于节点的拖放编辑器,其中每个节点表示一个操作(例如,读取此文件或对此数据进行排序等)。可以连接节点的输出和输入

我想实现的一个特性是,如果路径分支了,我可以自动开始一个线程来处理每个分支。然而,我关心几个问题:

  • 如果一条路径分支了,但后来又重新连接在一起,我将需要以某种方式对它们进行同步
  • 如果有多个开始节点(执行开始的地方),则必须单独管理它们的路径,然后可能动态地加入/合并
  • 我想限制创建的线程数量,这样我就不会突然有20个线程死锁
本质上,我想知道是否存在这样做的策略(不一定要寻找代码;只是理论)。调度算法有帮助吗

谢谢你的建议!我期待着听到你的建议

注意:我使用的是C#3.5,因此我没有任何有趣的并行任务能力。如果有必要,我将切换到C#4.0,但我希望避免这种情况。

这可能正是您想要的

我想象您基于节点的拖放编辑器如下所示:

每个节点本质上都是一个任务。任务可以是任何内容——从磁盘读取文件、从web下载数据或计算任何内容

任务完成后,它可以继续执行一个或多个其他任务,将旧任务的结果传递给新任务

一项任务还可以包括等待多个任务完成当所有这些任务完成时,此任务可以继续执行另一个任务,将所有任务的结果传递给新任务

TPL将调度线程池中的所有这些任务,这样线程就可以重用,每个任务不需要有自己的线程。TPL将为其运行的系统找到最佳线程数

将对异步操作的本机语言支持添加到C#,这使得处理任务变得非常简单和有趣

对于TPL,只需创建任务并根据节点布局组合它们

上述示例的完整程序代码:

var t1 = Task.Factory.StartNew<int>(() => 42);

var t2a = t1.ContinueWith<int>(t => t.Result + 1);
var t2b = t1.ContinueWith<int>(t => t.Result + 1);

var t3a = t2a.ContinueWith<int>(t => t.Result * 2);
var t3b = t2b.ContinueWith<int>(t => t.Result * 3);

var t4 = TaskEx.WhenAll<int>(t3a, t3b)
               .ContinueWith<int>(t => t.Result[0] + t.Result[1]);

t4.ContinueWith(t => { Console.WriteLine(t.Result); });

Console.ReadKey();
var t1=Task.Factory.StartNew(()=>42);
变量t2a=t1.继续(t=>t.结果+1);
var t2b=t1.继续(t=>t.结果+1);
变量t3a=t2a.继续(t=>t.结果*2);
变量t3b=t2b.继续(t=>t.结果*3);
变量t4=任务执行时间(t3a、t3b)
.继续(t=>t.Result[0]+t.Result[1]);
t4.ContinueWith(t=>{Console.WriteLine(t.Result);});
Console.ReadKey();

+1您还可以通过编写自己的TaskScheduler来控制希望它使用的线程数,库中还有许多其他扩展点。感谢您提供此dtb和Hightechrider,这看起来非常有用