2

優先度の異なるいくつかのメソッドを非同期で呼び出す必要があります。

私の最初のアイデアは、ThreadPool を使用して、スレッドの優先度を次のように変更することでした。

static void Run()
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod));
}

static void SomeMethod(object o)
{
  Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok?
  // do some work here
}

それは機能しますか、それとも何をお勧めしますか?

4

3 に答える 3

4

http://msdn.microsoft.com/en-us/library/0ka9477y.aspxによると、2.0 をターゲットにしている場合は機能しません。3.5 にはいくつかの違いがあることをほのめかしていますが、優先度については特に言及していません。

スレッド プール スレッドを使用しない場合

スレッド プール スレッドを使用する代わりに、独自のスレッドを作成して管理することが適切なシナリオがいくつかあります。

  • フォアグラウンド スレッドが必要です。

  • 特定の優先度を持つスレッドが必要です。

  • スレッドが長時間ブロックされる原因となるタスクがあります。スレッド プールには最大数のスレッドがあるため、多数のスレッド プール スレッドがブロックされると、タスクの開始が妨げられる可能性があります。

  • スレッドをシングルスレッド アパートメントに配置する必要があります。すべての ThreadPool スレッドはマルチスレッド アパートメントにあります。

  • スレッドに関連付けられた安定した ID を持つか、スレッドをタスク専用にする必要があります。

おそらく、独自の実装を考え出し、スレッドの作成を直接処理する必要があります。

質問:処理する一連のタスクがあり、優先度の高いタスクを最初に実行し、優先度の低いタスクを後で実行したい場合、何を達成しようとしていますか? または、実際に異なる優先度のスレッドが必要ですか?

于 2009-02-14T00:36:46.127 に答える
2

それは確か恐ろしい考えです。

一般的に言えば、スレッドまたはプロセスの優先度を設定することは非決定論的であり、その行為で他のスレッド/プロセスを枯渇させる可能性があるため、悪い考えです。また、飢餓のために、優先度の低いスレッド/プロセスの優先度を実際に上げる可能性があります。

その上、スレッド プールのスレッドは再利用されることを意図しており、スレッドの優先順位を変更することで、ルーチンの実行後に使用するスレッドを取得するタスクの期待を変更しています。

そうは言っても、選択肢は 2 つあります。タスクに優先順位を付ける必要があるだけで、タスクに関連しない他の項目が自分のタスクの前に実行されても構わない場合は、最も優先度の高い項目を取るいくつかのラッパー コードを使用して、プロデューサー コンシューマー パターンでスレッド プールを使用できます。あなたのキューから。

スレッドでタスクのみを実行する場合は、(System.Thread クラスを使用して) 独自のスレッド プールを作成し、ラッパー コードを使用して同じことを行い、優先度に基づいてタスクを実行する必要があります。

.NET 4.0 (まだリリースされていません) の System.Threading 名前空間の新しいクラスは、別のスレッド プールの作成を処理します。

于 2009-02-14T00:39:00.147 に答える
0

メソッドから抜けたときに、スレッドの優先度を元に戻す必要があります。(try ... finally または同様のものを使用)

于 2009-02-14T00:26:17.200 に答える