1

テキストボックス内の要素の合計と要素の数を同時に計算する必要があります。そこで、数値の長さ用と要素の合計用の 2 つのスレッドを作成することにしました。しかし、スレッドを 1 つだけ開始すると、正常に動作します。しかし、2 番目のスレッドを開始すると、フォームの動作が遅くなるか、まったく動作しなくなります。2つのスレッドを作成します

thrd = new Thread(GetLength);
thrd.Start();
thrd1 = new Thread(SetSum);
thrd1.Start();

そして、これらは、テキストボックス内の数値の長さを計算し、その要素の合計を計算するためのスレッドの関数です。

private void SetSum()
{
    while (true)
    {
       if (this.label3.InvokeRequired)
           this.Invoke(new Action(() => label3.Text = this.GetSum().ToString()));
    }
}

private int GetSum()
{
    string n = textBox1.Text;
    int sum = 0;
    for (int i = 0; i < n.Length; i++)
     {
            try
            {
                sum += int.Parse(n[i].ToString());
            }
            catch (FormatException) { };
        }
        return sum;
     }

private void GetLength()
{
    while (true)
     {
            if (this.label2.InvokeRequired)
                this.Invoke(new Action(() => label2.Text = " |  Length = " + textBox1.Text.Length.ToString()));
     }
}

問題はどこだ?同期?

私は解決策を見つけました - Thread.Sleep(1)GetLength メソッドに while ループを追加します

4

3 に答える 3

2

ここにいくつかの問題があります。

  1. 目の前のタスクは、(完全な) スレッドには小さすぎます。スレッドの作成にはコストがかかります。
  2. メイン アクションを呼び出すことにより、すべての作業がメイン スレッドで行われます。結局のところ、ソリューションはマルチスレッドではありません。
  3. カウントはサミングの副産物として簡単に実行できるため (またはその逆)、2 つのスレッド/タスクは過剰です。
  4. while(true) ...ループはプロセスを引きずり、無駄に CPU 時間を消費します。

ここでの簡単な答えは、スレッドを使用せず、 でいくつかのロジックを実行することtextBox1.TextChangedです。

于 2012-09-17T18:10:58.947 に答える
1

コードのこの部分は、Thread.Sleep やその他の Wait のない無限ループです。これにより、CPU が 100% になります。これを、GetLength をトリガーする何らかのイベントまたはその他のアクティビティに関連付ける必要があります。

private void GetLength() 
{ 
    while (true) 
     { 
            if (this.label2.InvokeRequired) 
                this.Invoke(new Action(() => label2.Text = " |  Length = " + textBox1.Text.Length.ToString())); 
     } 
} 
于 2012-09-17T18:12:13.093 に答える
1

はい、問題は実際には同期です。同期が多すぎます。

sのみを実行するスレッドを生成しています。Invokeこれは、UI スレッドがすべての作業を行っていることを意味します。

于 2012-09-17T18:10:51.957 に答える