イベントのサブスクライバが多いコンポーネントで非同期イベントディスパッチを行うためのオプションを探しています。オプションを熟読で、私はこの例に出くわしました:これは重大なリソースリークであるように、古い構文を越えてイベントを非同期で発生させる
public event ValueChangedEvent ValueChanged;
public void FireEventAsync(EventArgs e)
{
Delegate[] delegates = ValueChanged.GetInvocationList();
foreach (Delegate d in delegates)
{
ValueChangedEvent ev = (ValueChangedEvent)d;
ev.BeginInvoke(e, null, null);
}
}
を(サンプルは、.NET 1.1からだった)、それは私には見えます。完了方法、完了のためのポーリング、またはEndInvoke
が呼び出されるその他の方法はありません。
BeginInvoke
はすべてに対応するEndInvoke
である必要があります。さもなければ、非同期イベントの間に発生した(潜在的に)例外とともに、保留中のオブジェクトインスタンスが浮動しています(AsyncResult
)。
コールバックを指定してEndInvoke
を実行するだけで、それを変更するのは簡単ですが、必要がない場合は簡単です。 。 。
非同期例外の処理はまったく別の問題であり、UIスレッド(つまりInvokeRequired
など)との同期の必要性と相まって、これらの非同期通知を実行する考えは非常によく機能します。
ので、二つの質問:私はすべてのBeginInvoke
がEndInvoke
に対応する必要があることを信じるに修正
- アム?
- 上記以外にも、Windowsフォームアプリケーションで非同期イベント通知を行う際に、他の落とし穴がありますか?戻り型が指定されている場合
なぜ非同期でディスパッチしたいのですか?これが有益であることを示すパフォーマンス分析を行ったことがありますか?もしそうでなければ、複数のスレッドがそれを悪化させるかもしれません。 –
はい、パフォーマンス分析を行って、非同期処理が利益になるかどうかを判断しました。 –