イベントはC#で同期します。私は、メインフォームがストリームを聞くループを持つスレッドを開始するこのアプリケーションを持っています。ストリーム上に何かが来ると、ループからメインフォームにイベントが発生します。Cでイベントを非同期にする最良の方法#
メインフォームの速度が遅いか、メッセージボックスなどが表示される場合は、ループが一時停止されます。これの最善の方法は何ですか?コールバックを使用し、メインフォームで呼び出しますか?
イベントはC#で同期します。私は、メインフォームがストリームを聞くループを持つスレッドを開始するこのアプリケーションを持っています。ストリーム上に何かが来ると、ループからメインフォームにイベントが発生します。Cでイベントを非同期にする最良の方法#
メインフォームの速度が遅いか、メッセージボックスなどが表示される場合は、ループが一時停止されます。これの最善の方法は何ですか?コールバックを使用し、メインフォームで呼び出しますか?
私はその時に必要なものに依存したさまざまなシナリオを使用しました。
ほとんどの場合、BeginInvokeはおそらくコード作成が最も簡単だと思います。いずれにしても、Invokeを既に使用している必要があります。BeginInvokeに変更するだけです。別のスレッドでコールバックを使用すると、BeginInvokeを使用するのと同じことが実行されます(コールバックをキューに入れるためにスレッドプールを使用している限り)。
フォームを使用しているので、より簡単な方法はBackgroundWorkerコンポーネントを使用することです。
のBackgroundWorkerクラスを使用 は別の、 専用スレッド上で操作を実行することができます。時間がかかる 操作がダウンロードとデータベースのようになりました インターフェイス(UI)が のように見えて、 の実行中に応答が停止している可能性があります。応答性の高いUI が必要で、このような操作に長時間の遅延 が関連付けられている場合、 BackgroundWorkerクラスは という便利なソリューションを提供します。
私が同意しなければならないのは、BackgroundWorkerが一番きれいでクリーンな方法です。 –
イベントはちょうどdelegatesなので、BeginInvokeを使用してください。 (Making Asynchronous Method Calls in the .NET Environmentを参照してください)
あなたはいくつかのオプションを持っていますが、私の経験上、デリゲートとBeginInvokeを残した方が良いでしょう。代わりにBackgroundWorker(v2.0 +)を使うと使いやすいですまた、スレッドの完了時にメインフォームとやり取りすることができます。私はすべて非常に優れたソリューションを実装しています。
System.ComponentModel.BackgroundWorkerは確かに良い出発点です。あなたの非同期作業を行い、重要なイベントの通知を行い、フォームとの統合を強化します。
たとえば、ProgressChangedイベントのハンドラを登録して進捗通知をアクティブにすることができます。 (長い非同期プロセスがあり、アプリケーションが凍結したと思わないようにしたい場合は強くお勧めします)
これは私のアプリケーションに最適ですが、バックグラウンドワーカーにループを投げかけても、これを処理したいとは思えません。 –
EndInvokeも同様に使用することを忘れないでください。そうしないと、呼び出されたメソッドから例外がスローされません。 – dmigo