3

System.Threading.Taskオブジェクトを使用して .Net 4.5 のスレッド プールに作業項目 (デリゲート) をキューに入れる最も簡単な方法 (もしあれば) を知りたいです。私が本質的にやりたいことは、ThreadPool.QueueUserWorkItem()メソッドのキューイング機能をTasks で複製することです。私が間違っている場合は修正してください。ただし、このメソッドを使用してキューに入れられた作業項目は、キューに入れられた順序で実行されることが保証されていることがわかっています (マルチプロセッサのシナリオでは完全に間違っている可能性があります)。sを使用して、同じように動作するコードを作成する必要がありますTask

私はポータブル クラス ライブラリに取り組んでいるので、 を使用できないのですが、代わりにこの目的のために sThreadPool.QueueUserWorkItem()に頼る必要があります。Taskどのようなテクニックを提案しますか? デフォルトのタスク スケジューラはこの要件に適していますか?

4

2 に答える 2

4

ThreadPoolスケジュールされたのとまったく同じ順序でデリゲートを実行する必要はありません (少なくとも、ドキュメントでそのような保証は見つかりませんでした)。しかし、私が知る限り、それはほとんどどのように動作するかです.

Tasks (デフォルトのTaskScheduler) は、LIFO 順序で処理されるスレッド ローカル キューを使用するため、より複雑です。Taskすべての を確実にグローバル FIFO キューに送りたい場合は、 を使用できますTaskCreationOptions.PreferFairness。しかし、繰り返しになりますが、それが正確に何をするのかは文書化されていないため、詳細は変更される可能性があります.

于 2013-07-11T18:27:20.453 に答える
2

あなたが尋ねるのは、まさにタスクがすでに行っていることです。Task は基本的にラムダのラッパーであり、デフォルトでは ThreadPool で実行するためにキューに入れられます。その上、タスクは、継続、例外処理、キャンセル、およびマルチスレッドをより簡単にする多くの便利な機能を追加します。

ThreadPool を使用したくない場合は、独自のTaskSchedulerを作成し、新しいタスクを作成するときにそれを使用できます。TaskScheduler は基本的に Task を受け取り、実行のためにスケジュールします。

デフォルトの TaskScheduler は、ThreadPool.QueueUserWorkItem に加えて、ワークスティーリング マジックと複数のキュー処理を使用します。他の実装では、優先キューを使用したり、スレッドの最大数または最小数に独自の制限を設定したり、作成者が使用したい任意の手法を使用したりできます。

編集

ポータブル部分は最初から気がつきませんでした 。質問は、「PCL は ThreadPool を使用する TaskScheduler を提供するのか、それとも独自に作成する必要があるのか​​」ということです。

.NET 4+ は ThreadPoolTask​​Scheduler を提供します。残念ながら、これは PCL サブセットから欠落しているようです。独自の TaskScheduler を作成するか、Nuget Package を使用してプラットフォーム固有の実装を追加する必要があるようです。

どういうわけか、ThreadPoolTask​​Scheduler は Windows Phone プロジェクトには適していないと思います

Resharper と .NET のデバッグ シンボルを使用して掘り下げた後、PCL は利用可能なプラットフォームの TaskScheduler 実装を単独で検出すると思います。

.NET 4.0 では、TaskScheduler.Default は内部 BCL クラスである ThreadPoolTask​​Scheduler のインスタンスを返します。PCL サブセットでは、TaskScheduler.Default は null を返し、ThreadPoolTask​​Scheduler は使用できません。

ThreadPoolTask​​Scheduler のソース コードは、おそらく Microsoft の参照ソース サーバーから入手できますが、dotnetframework.orgですばやく参照することもできます。

新しいタスクを返す PCL クラスを作成し、それを .NET 4.5 コンソール アプリケーションから呼び出して、使用する TaskScheduler を確認しました。PCL クラスが実際に ThreadPoolTask​​Scheduler を使用していることがわかりました。

Windows 8 または Windows Phone 8 プロジェクトでこれを試したことはありませんが、各プラットフォームの既定の TaskScheduler を取得できると思います。

于 2013-07-11T11:56:22.610 に答える