2

しばらく作業した後、1000個のタスクを生成しても、すぐには開始されないことに気付きました。つまり、基本的に1000個のタスクを開始しても、そのうち100個が実行中で、900個が実行を待機しています。

だから私の質問は、彼らはどのように始めているのですか?.netは、タスクの実行を開始するタイミング、または実行を待機させるタイミングをどのように決定しますか?それらをすぐに開始するために私が従うことができる方法論は何ですか?特定の数のタスク/スレッドを常に実行したい。

タスクの代わりにスレッドを使用する場合、スレッドはすぐに実行を開始しますか、それとも.netはタスクのようにスレッドを開始しますか?

質問がはっきりしないかもしれませんので、はっきりさせてください。

基本的に私は1000個のタスクをスポーンしています(この数をスポーンしたままにします。1つのタスクが別のタスクの開始を完了したとき)タスクは125個Runningと875個だけですWaitingToRun:)

これが私がタスクを開始する方法です

        Task.Factory.StartNew(() =>
        {
            startCheckingProxies();
        });

c#wpf 4.5

4

2 に答える 2

5

タスクは、実際には内部のスレッドにすぎません。

新しいスレッドを生成することで得られるメリットには限界があります。各スレッドにはある程度のオーバーヘッドがあるため、ある時点で、オーバーヘッドは新しいスレッドを生成する利点を超えることになります。これらのタスクの生成をフレームワークに任せると、一度に実行するスレッドの数が自動的に決定され、それらのスレッドから得られると思われる生産性に基づいて決定されます。

最適な数が1000になることはないと確信しています。同時に実行するのに最適なスレッド数がマシンのコア数(私の場合は4)であるWindowsサービスを作成しました。

于 2013-03-03T14:29:53.207 に答える
5

オブジェクトについて話しているTask場合、それらはスレッド プールの上で実行されるため、個別のスレッドでそれぞれを実行しても、すべてがすぐに開始されるわけではありません。代わりに、限られた数のタスクが最初にプールからのスレッドで開始され、その後、スレッドが再利用されて次のタスクが実行されます。

もちろん、これは高レベルの説明にすぎません。背後にあるロジックはより複雑で、多くの最適化が実装されています。

詳細については、こちらこちらをご覧ください

また、オプションとスケジューラの設定を微調整できるオーバーロードでタスクを開始することもStartNewできます。ただし、多数のスレッドで実行すると、パフォーマンスが低下する可能性が高いことに注意してください。スレッドの作成とコンテキストの切り替えには多大なコストがかかり、何千ものスレッドを実行すると、IMO が逆効果になります。

于 2013-03-03T14:33:38.943 に答える