Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 同步100个线程的输出_C#_Multithreading - Fatal编程技术网

C# 同步100个线程的输出

C# 同步100个线程的输出,c#,multithreading,C#,Multithreading,我有100个线程,我想确保一次最多有三个线程按照它们创建的顺序运行 i、 e 我有从1到100的数字。我想把它打印如下 Thread1 Thread2 thread3 ' ' ' 但是一次只允许三个线程。一旦1,2,3中的任何一个线程完成。序列中的下一个线程应该启动 我知道我们可以使用semaphoreslim,但我想知道使用互斥或其他方式的答案 假设我的应用程序一次最多可以处理3个请求。但我收到100个请求,并希望以FIFO顺序一次最多处理3个请求。希望这消除了疑问,要同时运行最多三个线程,

我有100个线程,我想确保一次最多有三个线程按照它们创建的顺序运行

i、 e

我有从1到100的数字。我想把它打印如下

Thread1
Thread2
thread3
'
'
'
但是一次只允许三个线程。一旦1,2,3中的任何一个线程完成。序列中的下一个线程应该启动

我知道我们可以使用semaphoreslim,但我想知道使用互斥或其他方式的答案


假设我的应用程序一次最多可以处理3个请求。但我收到100个请求,并希望以FIFO顺序一次最多处理3个请求。希望这消除了疑问,

要同时运行最多三个线程,应使用大小为3的线程池。您应该实现一个线程池模式,该模式将执行请求排入FIFO队列,并且最大限制为同时执行三个请求


线程池将保证您的请求以相同的顺序开始执行,因为它使用FIFO队列。但是,这并不保证它们将以相同的顺序完成执行。

您应该省去使用原始线程的痛苦,并选择一个框架来完成所有繁重的工作

我建议使用Mircosoft的反应式框架(NuGet“Rx Main”)来实现这一点。代码非常简单:

var subscription =
    Observable
        .Range(0, 100)
        .Select(n => Observable.Start(() =>
        {
            Thread.Sleep(100);
            return n;
        }))
        .Merge(maxConcurrent: 3)
        .Subscribe(n => Console.WriteLine(n));
使用此代码,我得到以下结果:

1
3
2
0
5
6
7
4
8
9
...
95
97
96
98
99

您可以通过调用
subscription.Dispose()停止计算

一旦1,2,3中的任何线程完成。序列中的下一个线程应该开始。
我不太清楚您要的是什么。您想按顺序运行100个线程吗?如果是这样,为什么?如果线程必须按顺序完成,则没有使用它们的可能。考虑到一个场景,我的应用程序得到1000个请求,但我想确保仅以FIFO顺序一次只提供3个请求。我只是举了一个100个线程和数字的例子。我不确定上面在c#中使用互斥。我是说,使用线程池是解决问题的方法。@MickyDuncan只要你不知道为什么海报指定了整整三个线程,那么你就不知道这是否是一个理想的解决方案。此解决方案是控制同时执行的并发线程数的理想解决方案。此外,多线程与内核数量无关!这是对你删除的评论的回复。我已经编辑了我的答案,看起来好多了。否决票被删除。祝你好运weekend@SuyogShah-如果它们运行在不同的线程上,则不会。你想让它们在不同的线程上运行,并且井然有序?