2

私は ThreadPool.QueueUserWorkItem で作業しようとしていますが、そのうちの 2 つを実行すると、次のようになります。

ThreadPool.QueueUserWorkItem(new WaitCallback(x=>function A); 
ThreadPool.QueueUserWorkItem(new WaitCallback(x=>function B);

1 秒未満でスタックすることがあります。何か案は?

呼び出しの 1 つは、ゲームのカウントダウン タイマーです。

ThreadPool.QueueUserWorkItem(new WaitCallback(x=>initClock(0,0)));

private void initClock(int sec , int hunS)
{
    int half = gameClock / 2;
    seconds = sec;
    while (true)
    {   
        while (clockLock == false && seconds < gameClock)
        {
            hunSec = hunS;
            while (clockLock == false && hunSec < 100)
            {
                Thread.Sleep(10);
                updateClock(seconds, hunSec);
                hunSec++;
            }
            seconds++;
            if (half == seconds)
            {
                panel5.BackColor = Color.Red;
            }
        } 
    }
}

private void updateClock(int sec, int secRem)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action<int, int>(updateClock), sec, secRem);
    }
    else
    {                
        clock_Label.Text = sec.ToString() + ':' + secRem.ToString();
    }
}
4

2 に答える 2

1

これらのタスクの多くを開始していて、それぞれが長時間ブロックされていますか? 提供された情報によると、これは事実である可能性があります。

これは、一度に多くのスレッドをアクティブにできることを意味します。最小制限を超えてスレッドプールを使用すると、追加のスレッドを開始すると(私は信じています)500ミリ秒抑制されます。これが遅延の原因である可能性があります。

その問題を解決する方法は?

  1. より少ないスレッドを開始します。非同期 IO と非同期待機を使用します。それらはスレッドを使用しません。それをawait行うのは非常に簡単です。
  2. スレッド プールの最小制限を増やします。SetMinThreads.
于 2014-08-03T21:21:51.487 に答える
0

そこには怪しいものがあります。いつinitClock終わりますか?アプリケーションを終了すると、まったくないように見えます。

そのため、エントリ ポイントで多数のスレッド プール スレッドを開始している場合、スレッド プールの容量initClockが不足するのはそのためです。この場合、最小スレッド数をどれだけ増やしても、このように動作します。

その背後にあるロジックはわかりませんが、残りの秒数が0になったら終了したいと思っていると思います。したがって、これを修正すると、おそらく動作が修正されます。

最後に一つだけ; このステートメントは UI を更新します。

        if (half == seconds)
        {
            panel5.BackColor = Color.Red;
        }

実際にその実行を UI スレッドにディスパッチする必要があります ( のInvoke場合と同様に、 を介してupdateClock)。私はそれがうまくいくかもしれないことを知っていますが、それはそれを正しくしません。

1 秒未満でスタックすることがあります。何か案は?UI で観察したことを参照している必要があります。そのラベルclock_Labelは期待したほど速く更新されません。

たとえば、そのラベルのリフレッシュ レートを下げます。更新するときは、10msごとに更新します。それは必要ですか?このラベルには秒が表示されているため、間隔を 500 ミリ秒に増やすこともできます。応答性にどのような違いがあるかを確認してください。

于 2014-08-03T21:44:59.343 に答える