サードパーティのライブラリを使用してデータを処理するアプリケーションを作成しています。非常に単純化された例では、次のようなタスクとして実行されるメソッドがあります。
private void ProcessListOfItems(List<string> items)
{
while (items.Count > 0)
{
3rdPartyLibObject.Process(items[0]);
items.Remove(0);
}
}
ご覧のとおり、現在のコードの記述方法では、Process() メソッドが返されるとすぐにリストから各項目を削除します。しかし、アイテムの処理が失敗する可能性があり、それが起こるかどうかを知る必要があります. 残念ながら、Process() メソッドはアイテムが正常に処理されたかどうかを示す bool 値を返さず、ProcessingComplete および ProcessingFailed イベントを発生させます。次のように、これらのイベントに接続されたイベント ハンドラーがあります。
3rdPartyLibObject.ProcessingComplete += obj_ProcessingSuccess;
3rdPartyLibObject.ProcessingFailed += obj_ProcessingFailed;
private void obj_ProcessingSuccess(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { true });
}
private void obj_ProcessingFailed(object sender, 3rdPartyLibObject.ProcessingEventArgs e)
{
this.Invoke(new ProcessedHandler(OnProcessed), new object[] { false });
}
private void OnProcessed(bool success)
{
if (success)
{
Debug.WriteLine("Item was processed succesfully!");
}
else
{
Debug.WriteLine("Failed to process item!");
}
}
私がやりたいのは、 3rdPartyLibObject.Process() への呼び出しの直後から、イベント ハンドラーの 1 つが起動するまで、コード ブロックを保持することです。リストかどうか)。これはおそらく珍しい状況ではないと思いますが、これまでに遭遇したことはありません。この種のシナリオに対処するための一般的に合意されたベスト プラクティスはありますか?