有时当我使用具有异步方法进行交互的程序集时(你调用一个方法,然后你得到一个回复的事件)我喜欢通过在方法中嵌入事件处理程序将它们转换为synchrounus方法。
问题是;我没有看到任何其他地方的这种代码所以我有一种令人讨厌的感觉,这种方法有一些主要的缺点,我错过了,其他人都看到了。所以你怎么想 - 编写这样的代码是否可以?
嵌入连接事件的事件处理程序的Logon方法的简单示例。
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");
}
我也认为这种类型的代码,即使实际的方法可能变得有点复杂,也可以帮助保持一个封装了一个对象的类,其中包含大量事件,并且易于阅读。