相互作用に非同期アプローチを持つアセンブリを使用する場合 (メソッドを呼び出して、応答と共にイベントが返される) は、メソッドにイベント ハンドラーを埋め込むことによって、アセンブリを同期メソッドに変換するのが好きな場合があります。
質問は; この種のコードはどこにも見当たらないので、このアプローチには、私が見逃して他の人が見ている重大な欠点があるのではないかと不快に感じています。では、このようなコードを書いても問題ないと思いますか?
接続イベントのイベント ハンドラーを埋め込む 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");
}
また、このタイプのコードは、実際のメソッドが少し複雑になる可能性があるとしても、多くのイベントを持つオブジェクトをカプセル化するクラスをクリーンで読みやすく保つのに役立つと思います。