概要
当多个任务或线程并行运行时,难以避免的对某些有限的资源进行并发的访问。可以考虑使用信号量来进行这方面的控制(System.Threading.Semaphore)是表示一个Windows内核的信号量对象。如果预计等待的时间较短,可以考虑使用SemaphoreSlim,它则带来的开销更小。
.NetFrameWork中的信号量通过跟踪进入和离开的任务或线程来协调对资源的访问。信号量需要知道资源的最大数量,当一个任务进入时,资源计数器会被减1,当计数器为0时,如果有任务访问资源,它会被阻塞,直到有任务离开为止。
示例程序: 10个任务并行访问3个资源
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
namespace Sample5_8_semaphoreslim
{
class Program
{
private static int _TaskNum = 10;
private static Task[] _Tasks;
private const int MAX_RESOURCE = 3;
private const int RUN_LOOP = 10;
private static SemaphoreSlim m_Semaphore;
private static void Work1(int TaskID)
{
int i = 0;
var sw = Stopwatch.StartNew();
var rnd = new Random();
while (i < RUN_LOOP)
{
Thread.Sleep(rnd.Next(200, 500));
Console.WriteLine("TASK