Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
限制许多.NET任务实例的最佳方法是什么?_.net_Multithreading_Scheduling_Task - Fatal编程技术网

限制许多.NET任务实例的最佳方法是什么?

限制许多.NET任务实例的最佳方法是什么?,.net,multithreading,scheduling,task,.net,Multithreading,Scheduling,Task,我已经创建了大量的任务实例。我需要运行它们,并等待它们全部完成。问题是,我需要确保在任何给定时间,“开始”和“完成”之间的任务不超过X个;这些任务涉及对同时呼叫数量有限制的其他方的呼叫。由于这些限制不是基于我的硬件,我不能依赖任何内置的智能节流;我需要严格执行这个限制。我已经能够通过让任务以线程安全的方式递增和递减一个共享变量来实现这一点,但它似乎不必要地麻烦。是否有一种更直接内置于API的方法,或者我缺少的一种简单的同步工具?信号量类可能适合您: 在这个MSDN页面上有一个很好的例子向您展示如

我已经创建了大量的任务实例。我需要运行它们,并等待它们全部完成。问题是,我需要确保在任何给定时间,“开始”和“完成”之间的任务不超过X个;这些任务涉及对同时呼叫数量有限制的其他方的呼叫。由于这些限制不是基于我的硬件,我不能依赖任何内置的智能节流;我需要严格执行这个限制。我已经能够通过让任务以线程安全的方式递增和递减一个共享变量来实现这一点,但它似乎不必要地麻烦。是否有一种更直接内置于API的方法,或者我缺少的一种简单的同步工具?

信号量类可能适合您:

在这个MSDN页面上有一个很好的例子向您展示如何使用它


也可能有重量较轻的内置线程池/同步机制可用于实现相同的目的,但信号量基本上是为满足您的要求而设计的。

您必须创建自己的任务调度器,请参阅

编辑:这需要比使用信号量更多的代码,但我觉得这可能会执行得更好,因为执行任务的线程池不知道您的信号量,但使用TaskScheduler是按照他们的规则进行的


编辑2:使用信号量的一个可能缺点是线程池可能认为您的任务正在执行IO操作,并且一次安排了很多IO操作(因此它们挂起等待,因为它们不需要CPU)。使用TaskScheduler,它们将在有位置时准确地进行调度。它肯定会使池更干净。

信号灯对我来说是个不错的解决方案。如果谈到.net 4.0和信号灯,我建议看一下信号灯LIM: