9

私のWPFアプリケーションでは、UIが応答しなくなるのを防ぐために、UI以外のスレッドでいくつかの作業を行いたいと思います。そのために私はこれをしました:

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType);
caller.BeginInvoke(_patterns, null, null);

そして、デリゲートは次のように定義されます。

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data);

私の質問は:

BeginInvoke()新しいスレッドを作成し、その中でコールバックSetPatternTypeを実行しますか?もしそうなら、このスレッドはどのくらい続きますか?

このアプローチは一般的に良いですか?そうでない場合、それの何が問題になっていますか?そして、私が直面する可能性のある潜在的な問題は何ですか?

C#4.0とVisualStudio2010を使用しています。


編集:

また、これらに関するいくつかのガイドラインが必要です。

いつ自分で新しいスレッドを作成する必要があり、いつ使用する必要がありBeginInvoke()ますか?そして、いつDispatcherObject.Dispatcher.BeginInvoke()オブジェクトを使用する必要がありますか?

4

3 に答える 3

12

技術的にはnot a new threadスレッドプールスレッドであり、プロセス/プログラムよりも長持ちしますが、終了するとすぐに非同期呼び出しを実行する他のスレッドを実行する可能性があります。完全な詳細については、非同期プログラミングスレッドプールに関するMSDNの記事を確認してください。

また、関心に応じて、I /OCompletionPortで詳細を確認してください。

非同期プログラミングは、一般的に少なくとも同期コードよりも優れていると考えられていますが、.NET 4.0を使用している場合は、タスク並列ライブラリを参照してください。

質問の編集に基づいて、いつ自分のスレッドを作成する必要がありますか?独自のスレッドを作成するよりも、BeginInvokeまたはAsyncプログラミングを使用する方が常に優れています。いくつかのタスク/作業を継続的に実行する専用スレッドが必要であり、アプリケーションの複数のスレッドに必要な同期メカニズムについて明確である場合は、厳密に独自のスレッドを作成してください。本当にやむを得ない理由がない限り、できる限り新しいスレッドを作成しないでください。あなたは今日スレッドを追加し、おそらく次に進みます。2年後、3人の開発者は、いくつかの継続的なもののために追加のスレッドが追加されたことを確認します。私はこれが起こっているのを見たことがあると信じてください。したがって、正しい慣行を設定し(つまり、非同期メソッドを使用して)、人々はそれに従おうとします。150スレッドのアプリケーションを見たことがありますが、

私の東芝ラップトップで実行中のすべてのプロセスでそのような不適切に設計されたアプリをチェックしたところ、東芝Bluetoothマネージャーは53スレッドを使用して私のボックスで最悪の設計プログラムの王冠を獲得しました。:)

于 2011-04-07T08:12:47.373 に答える
9

スレッドプールを使用するため、必ずしも新しいスレッドを作成する必要はありませんが、呼び出し元のスレッドとは異なるスレッドで実行されます(デリゲートの呼び出しがスケジュールされる前にタスクを終了するスレッドプールスレッド自体である場合を除く)。同じスレッドを使用する可能性はほとんどありません)。

于 2011-04-07T08:11:31.443 に答える
3

Dispatcher.CurrentDispatcherは、WPFの新しいものです(WinFormsのInvokeRequiredのものを置き換えるものです)。

Dispatcherを使用して、GUIに必要な更新をキューに入れることができ、GUIにはさまざまな優先順位があります。

このMSDNリンクを参照してください

于 2011-04-07T11:17:24.133 に答える