gpt4 book ai didi

c# - 如何使用这个信号量

转载 作者:行者123 更新时间:2023-11-30 12:16:35 24 4
gpt4 key购买 nike

        List<int> cuis = PersistencyServices.GetListOfAllCui();             
ResourceLock = new Semaphore(3, 5);


foreach (var cui in cuis)
{

Thread workThread = new Thread(new ParameterizedThreadStart(Worker));

workThread.Start(cui);

}

}
public static void Worker(object cui)
{

ResourceLock.WaitOne();

Debug.WriteLine(String.Format("Thread for cui {0} in", cui));

Thread.Sleep(5000);
ResourceLock.Release();
}

此代码一次只允许 3 个线程处于临界区。但问题是,因为列表包含超过 100 万条记录,所以我得到了 OutOfMemoryException。我认为这是因为即使信号量只允许3个线程进入临界区,但是创建了100万个线程等待信号量。我应该如何更改我的代码以防止这种情况发生?请帮忙

最佳答案

你真的不想要一百万个线程。不清楚你在做什么,但它看起来可能 Parallel.ForEach(...) 会在这里做你想做的一切,工作量很小理智。

如果你只想强制执行 3 个线程:

Parallel.ForEach(cuis, new ParallelOptions { MaxDegreeOfParallelism = 3 },
Worker);

与:

public static void Worker(int cui)
{
Debug.WriteLine(String.Format("Thread for cui {0} in", cui));
Thread.Sleep(5000);
}

如果你真的想使用信号量,使用WaitOne来循环:

foreach (var cui in cuis)
{
ResourceLock.WaitOne();
Thread workThread = new Thread(new ParameterizedThreadStart(Worker));

workThread.Start(cui);

}
...
public static void Worker(object cui)
{
Debug.WriteLine(String.Format("Thread for cui {0} in", cui));

Thread.Sleep(5000);
ResourceLock.Release();
}

关于c# - 如何使用这个信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com