Bra*_*ore 1 c# events asynchronous synchronous
我正在使用包含异步方法的api与PIN设备集成.例如,其中一个名为GetStatus,它会引发一个DeviceStateChangedEvent,并将状态作为参数传递给它.
我希望有一个非异步的接口,所以当我在我的界面上调用GetStatus时,它实际上会返回状态而不是引发一个事件来将数据传递给我.
我想我可以这样做:
public class MSRDevice
{
StatusInfo _status;
bool _stateChangedEventCompleted = false;
IPAD _ipad; // <-- the device
public MSRDevice()
{
//Initialize device, wire up events, etc.
}
public StatusInfo GetStatus()
{
_ipad.GetStatus() // <- raises StatusChangedEvent
while(!_stateChangedEventCompleted);
_stateChangedEventCompleted = false;
return _status;
}
void StateChangedEvent(object sender, DeviceStateChangeEventArgs e)
{
_status = e.StatusInfo;
}
}
Run Code Online (Sandbox Code Playgroud)
这是解决这个问题的好方法还是有更好的解决方案?
你在你的例子中所做的事情被称为" 忙碌等待 "(或"旋转"),这在大多数情况下都是不推荐的,因为它浪费了大量的CPU能力.优选地,您应该使用信号机制(例如WaitHandle类StatusChangedEvent)在发生感兴趣的事件(在您的情况下)时进行同步:
public class MSRDevice
{
StatusInfo _status;
IPAD _ipad; // <-- the device
private EventWaitHandle waitHandle = new AutoResetEvent(false);
public MSRDevice()
{
//Initialize device, wire up events, etc.
}
public StatusInfo GetStatus()
{
_ipad.GetStatus() // <- raises StatusChangedEvent asynchronously
waitHandle.WaitOne(); // <- waits for signal
return _status;
}
void StateChangedEvent(object sender, DeviceStateChangeEventArgs e)
{
_status = e.StatusInfo;
waitHandle.Set(); // <- sets signal
}
}
Run Code Online (Sandbox Code Playgroud)