你这些WaitHandle看看里面是不是有很多waitone的重载,是不是有些带类似超时的的东西?
另一种方案,你直接用cas的Interlocked的CompairExchange也可以做到这个功能。
谢谢支招,让Wait超时是访问者的手法,我其实更关心从提供者角度出发的办法。另外请问cas是什么?
@ahdung: compare and swap,一个原子性的操作。
@Daniel Cai: 哦我以为是什么第三方类库,您是指.net自带Interlocked类是吧。但这个弯我没转过来,CompairExchange如何能达到目的?有妙用?
@ahdung: CompairExchange
传入3个参数,一个是目标,一个是期望换的值,一个是与目标相比的值
如果目标与比较值相同则进行更换且返回目标更换之前的值。
你在你所谓的提供者这块就可以使用这个做限制了。
int status=0;
....
bool TryGetResource(...out Resource res)
{
Resource res=null;
if(Interlocked.CompairExchange(ref status,1,0)==0)
{
//someone got the resource
res=....;
return true;
}
//in case when no resouces is available
return false;
}
void ReturnResource(Resource res)
{
//return your resource
...
Interlocked.Exchange(ref status,0);
}
@Daniel Cai: 感谢耐心指教,我参悟一下先
我们项目中两处跳过锁的代码。希望对你有帮助。
感谢无私分享!原来Interlocked真有妙用,学习了。不过我仍然想知道在提供者的角度能不能喊人家不要等。