ThreadBがイベントの発生を待機するのをブロックせずに、 ThreadAが何らかのイベントのThreadBにシグナルを送る適切な手法は何ですか?
共有 List<T> を埋めるバックグラウンド スレッドがあります。取得できるデータがあることを「メイン」スレッドに非同期で通知する方法を見つけようとしています。
EventWaitHandle オブジェクトを使用してイベントを設定することを検討しましたが、メイン スレッドを Event.WaitOne() に置くことができません。
私はデリゲート コールバックを持つことを検討しましたが、a) メイン スレッドがデリゲートで作業を行うことを望んでいません: スレッドは作業に戻ってさらに何かを追加する必要があります - デリゲートの実行中にスレッドを待機させたくありません。 ) デリゲートをメイン スレッドにマーシャリングする必要がありますが、UI を実行していません。デリゲートを呼び出します。
私は、ゼロ間隔のSystem.Windows.Forms.Timerを開始するデリゲートコールバックがあると考えました(タイマーへのスレッドアクセスが同期されています)。このようにして、スレッドは呼び出し時にスタックするだけで済みます
Timer.Enabled = true;
しかし、それはハックのようです。
昔は、私のオブジェクトは非表示のウィンドウを作成し、スレッドにその非表示のウィンドウの HWND にメッセージを投稿させていました。非表示のコントロールを作成することを検討しましたが、ハンドルが作成されていないコントロールで.Invokeできないことがわかりました。さらに、UI がありません。オブジェクトは、Web サーバー、サービス、またはコンソールで作成された可能性があります。グラフィカル コントロールが表示されることも、System.Windows への依存関係をコンパイルすることもありません。フォーム。
オブジェクトに ISynchronizeInvoke インターフェイスを公開させることを検討しましたが、.Invoke() を実装する必要があり、それが私の問題です。
イベントが発生するのを待ってスレッド B をブロックせずに、スレッド A に何らかのイベントのスレッド B を通知させる適切な手法は何ですか?