【发布时间】:2020-04-21 01:13:36
【问题描述】:
我可以像这样使用 SemaphoreSlim 来等待偶数触发:
public class MyClass
{
private SemaphoreSlim _signal;
private ObjectThatHasEvent _object;
public MyClass()
{
_signal = new SemaphoreSlim(0, 1);
_object = new ObjectThatHasEvent();
_object.OnEventFired += _object_OneEventFired;
}
public asnyc void Run()
{
_object.DoStuffAndFireEventAfterwards();
_signal.WaitAsync();
}
private void _object_OnEventFired(object sender, EventArgs e)
{
_signal.Release();
}
}
但是,如果我需要先等待来自_object 的事件完成,然后再等待另一个事件,然后再调用_signal.Release(),该怎么办?像这样:
public class MyClass
{
private SemaphoreSlim _signal;
private ObjectThatHasEvent _object;
public MyClass()
{
_signal = new SemaphoreSlim(0, 1);
_object = new ObjectThatHasEvent();
_object.OnConnected += _object_OnConnected;
_object.OnWorkFinished += _object_OnWorkFinished;
_object.OnDisconnected += _object_OnDisconnected;
}
public async Task Run()
{
_object.Connect();
await _signal.WaitAsync();
}
private void _object_OnConnected(object sender, EventArgs e)
{
_object.DoWork();
//How to wait for work finished here?
_object.Disconnect();
}
private void _object_OnWorkFinished(object sender, EventArgs e)
{
//Only disconnect after this has finished...
}
private void _object_OnDisconnected(object sender, EventArgs e)
{
_signal.Release();
}
}
【问题讨论】:
-
你能再创建一个信号量吗?或者在信号量上允许 2 个线程而不是一个,并使用 CurrentCount 来确保信号量在正确的位置等待?因此,在 Run() 中,在等待之前确保 _signal.CurrentCount == 0,并在 _object_OnConnected(object sender, EventArgs e) 中检查 _signal.CurrentCount == 1,然后再次等待,然后在 _object_OnWorkFinished(object sender, EventArgs e) 中释放和 _object_OnDisconnected(object sender, EventArgs e)
-
仅供参考,事件的名称不以
On开头。例如,按钮将具有Click事件,而不是OnClick事件。当您看到OnClick方法时,它们通常是类用于引发Click事件的protected void方法。