15

イベントはC#で同期されます。このアプリケーションでは、メインフォームがストリームをリッスンするループを含むスレッドを開始します。ストリームに何かが発生すると、ループからメインフォームにイベントが発生します。

メインフォームが遅いか、メッセージボックスなどが表示されている場合、ループは中断されます。これを回避する最善の方法は何ですか?コールバックを使用してメインフォームで呼び出すことによって?

4

5 に答える 5

8

フォームを使用しているので、 BackgroundWorkerコンポーネントを使用するのがより簡単な方法です。

BackgroundWorkerクラスを使用すると、別の専用スレッドで操作を実行できます。ダウンロードやデータベーストランザクションなどの時間のかかる操作により、ユーザーインターフェイス(UI)が実行中に応答を停止したように見える場合があります。レスポンシブUIが必要で、そのような操作に関連する長い遅延に直面している場合、BackgroundWorkerクラスは便利なソリューションを提供します。

于 2008-09-17T07:03:00.527 に答える
3

うーん、その時点で必要なものに応じて、さまざまなシナリオを使用しました。

もうすぐそこにいるので、おそらく BeginInvoke が最も簡単にコーディングできると思います。いずれにせよ、すでに Invoke を使用しているはずなので、BeginInvoke に変更するだけです。別のスレッドでコールバックを使用すると、BeginInvoke を使用した場合と同じことが達成されます (スレッドプールを使用してコールバックをキューに入れる限り)。

于 2008-09-17T07:05:04.093 に答える
1

イベントはデリゲートなので、BeginInvoke を使用します。(「.NET 環境で非同期メソッド呼び出しを行う」を参照)

于 2008-09-17T07:05:44.263 に答える
0

System.ComponentModel.BackgroundWorkerは確かに良い出発点です。非同期作業を行い、重要なイベントを通知し、フォームとの統合を改善する方法を提供します。

たとえば、ProgressChanged イベントのハンドラーを登録することで、進行状況通知を有効にすることができます。(これは、長い非同期プロセスがあり、ユーザーにアプリケーションがフリーズしたと思わせたくない場合に強くお勧めします)

于 2008-09-17T07:58:54.887 に答える
0

すでに詳述したように、いくつかのオプションがありますが、私の経験では、デリゲートと BeginInvoke を残して、代わりに BackgroundWorker (v2.0+) を使用することをお勧めします。スレッドの完了時にメインフォーム。全体として、非常によく実装されたソリューションであることがわかりました。

于 2008-09-17T07:13:49.033 に答える