有时,当我使用具有异步交互方法的程序集时(您调用一个方法,然后您得到一个带有答案的事件),我喜欢通过在方法中嵌入事件处理程序将它们转换为同步方法。
问题是; 我在其他任何地方都看不到这种代码,所以我有一种令人讨厌的感觉,即这种方法存在一些我错过的主要缺点,而其他人都看到了。那么你怎么看 - 写这样的代码可以吗?
嵌入连接事件的事件处理程序的登录方法的简单示例。
private void Logon(GatewayConnection connection)
{
const int fiveSecondTimeout = 5000;
ManualResetEvent waitUntilOnlineEvent = new ManualResetEvent(false);
EventHandler<ConnectionEventArgs> connectionHandler = (sender, e) =>
{
if (connection.Status == ConnectionStatus.Connected)
waitUntilOnlineEvent.Set();
};
connection.ConnectionEvent += connectionHandler;
connection.Connect();
bool timeoutReached = !waitUntilOnlineEvent.WaitOne(fiveSecondTimeout);
connection.ConnectionEvent -= connectionHandler;
if (timeoutReached)
throw new ApplicationException("Logon failure");
}
我还认为,这种类型的代码,即使实际方法可能变得有点复杂,也有助于保持封装具有大量事件的对象的类的简洁和易于阅读。