使用时WaitHandle.WaitAny and Semaphore class像下面这样:
var s1 = new Semaphore(1, 1);
var s2 = new Semaphore(1, 1);
var handles = new [] { s1, s2 };
var index = WaitHandle.WaitAny(handles);
handles[index].Release();
似乎可以保证只有一个信号量被获取WaitHandle.WaitAny
.
是否可以为异步(async/await)代码获得类似的行为?
我想不出内置的解决方案。我会这样做:
var s1 = new SemaphoreSlim(1, 1);
var s2 = new SemaphoreSlim(1, 1);
var waits = new [] { s1.WaitAsync(), s2.WaitAsync() };
var firstWait = await Task.WhenAny(waits);
//The wait is still running - perform compensation.
if (firstWait == waits[0])
waits[1].ContinueWith(_ => s2.Release());
if (firstWait == waits[1])
waits[0].ContinueWith(_ => s1.Release());
这会获取两个信号量,但会立即释放第二个信号量。这应该是等价的。我无法想象不必要地获取信号量的负面后果(当然性能除外)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)