Pau*_*ulH 14 c# multithreading .net-3.5
我有一个Visual Studio 2008 C#.NET 3.5项目,其中一个类侦听来自另一个多线程类的事件调用.我需要确保我的事件只允许同时访问最多10个线程.第11个线程应该阻塞,直到10个完成之一.
myobj.SomeEvent += OnSomeEvent;
private void OnSomeEvent(object sender, MyEventArgs args)
{
// allow up to 10 threads simultaneous access. Block the 11th thread.
using (SomeThreadLock lock = new SomeThreadLock(10))
{
DoUsefulThings(args.foo);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法控制其他MyObj类,所以我无法在那里实现线程池.
实现这个的最佳方法是什么?
谢谢,PaulH
Chr*_*ain 21
你想要Semaphore类.简而言之,它是一个锁,只允许指定数量的呼叫者随时通过.
由于您不控制线程的创建,因此您需要注意死锁情况.信号量不是可重入的 - 如果给定的线程不止一次地进入信号量,它将需要不止一个时隙.因此,如果每个调用者的线程不止一次进入您的信号量,就有可能出现死锁.
使用一个Semaphore.构造函数参数对刚引入类的人来说有点混乱.第一个参数指定现在允许的初始线程数.第二个参数指定在任何给定时间允许的最大线程数.
myobj.SomeEvent += OnSomeEvent;
Semaphore semaphore = new Semaphore(10, 10);
private void OnSomeEvent(object sender, MyEventArgs args)
{
semaphore.WaitOne();
try
{
DoUsefulThings(args.foo);
}
finally
{
semaphore.Release();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |