1

WinForms アプリケーションで設定ThreadPool.SetMaxThreadsした場合、この設定は作業項目のみに適用されますか、それともタイマーや GUI 更新などのアセンブリ スレッド全体に適用されますか?

私は、通常はそれぞれ約 1 分の半短時間の操作を継続的に処理するアプリケーションを構築しています。私は最初に、正常に動作する手動スレッド作成バージョンを思いつきました。操作ごとに新しいスレッドを作成しているので、より高速で効率的なバージョンを作成できるかどうかを調べています。ThreadPool を試してみましたが、うまく機能せず、タイマーと GUI の更新もブロックされました。これは正常ですか、それとも間違った使い方をしていますか?

ここに私の疑似コードがあります:

手動スレッド バージョン: (すべてMaxThreadThreadCount読み取りと書き込みはロックで行われます)

timer1.Tick += Tick();

private void Tick()
{
    //do some text logging
    //do some TextBox updating
}

int MaxThreads = 10

while(true)
{
    if(ThreadCount < MaxThreads)
    {
        new Thread(() => Process()).Start();
        ThreadCount++;
    }
    else
    {
        Thread.Sleep(10000);
    }
}

private void Process()
{
    //do something

    ThreadCount--;
}

ThreadPool バージョン: (コンピューターは 32 ビット Windows サーバー OS のデュアルコア Xeon)

timer1.Tick += Tick();

private void Tick()
{
    //do some text logging
    //do some TextBox updating
}

ThreadPool.SetMaxThreads(10,10) **<--removing this didn't help with freezing at all**

while(true)
{
    if(ThreadPool.GetAvailableThreads() > 0)
    {
        ThreadPool.QueueWorkItem(Process, null)
    }
    else
    {
        Thread.Sleep(10000);
    }
}

private void Process()
{
    //do something
}
4

2 に答える 2

3

According to my research on MSDN, limiting the number of ThreadPool threads will affect the following threading mechanisms:

  • ThreadPool
  • System.Threading.Timer
  • System.Timers.Timer
  • TPL Tasks

since under the hood they are using the thread pool to run their work.
The following will run on their own thread:

  • Thread
  • BackgroundWorker

The GUI timers will run on the UI thread: System.Windows.Threading.DispatcherTimer and System.Windows.Forms.Timer.

于 2012-07-13T09:49:12.143 に答える
1

ここで使用している方法は、目的を達成するための最良の方法ではないように思えます。

スレッドプールに最適なスレッド数を推測することは賢明ではありません。これには多くの要因が関係します。フレームワークと OS の方がはるかに優れた機能です。

この場合、Sempaphore を使用した方がよいでしょう。

あなたの質問への回答として、これに関する素晴らしい記事がここにあります。

スレッドプールのスロットリング

于 2012-07-13T08:18:19.707 に答える