0

私はC#の初心者です。そして、次の 2 つの例で異なる結果が得られる理由がわかりません。msdnでマイクロソフトの例を使用しています。最初の例では、テキスト ボックスに 1 つの数値が表示されます。2 番目の例では、スレッドごとに 0 から 1000 までのすべての数値が表示されます。

最初の例:

    delegate void SetTextCallback(object text);

    private void WriteString(object text)
    {

        if (this.textBox1.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(WriteString);
            this.BeginInvoke(d, new object[] { text });
        }
        else
        {
            for (int i = 0; i <= 1000; i++)
            {
                textBox1.Text = text.ToString();
            }

        }

    }

2 番目の例:

    private void MyApp_Load(object sender, EventArgs e)
    {
        System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

    }

    private void WriteString(object text)
    {
        for (int i = 0; i <= 1000; i++)
        {
            textBox1.Text = text.ToString();
        }
    }

そして、これらの例を呼び出すメソッド

    private void button1_Click(object sender, EventArgs e)
    {

        Thread th_1 = new Thread(WriteString);
        Thread th_2 = new Thread(WriteString);
        Thread th_3 = new Thread(WriteString);
        Thread th_4 = new Thread(WriteString);

        th_1.Priority = ThreadPriority.Highest; 
        th_2.Priority = ThreadPriority.BelowNormal; 
        th_3.Priority = ThreadPriority.Normal; 
        th_4.Priority = ThreadPriority.Lowest; 

        th_1.Start("1");
        th_2.Start("2");
        th_3.Start("3");
        th_4.Start("4");

        th_1.Join();
        th_2.Join();
        th_3.Join();
        th_4.Join();
    }
4

1 に答える 1

0

さて、VSで分析しました。私はC#も初めてです。しかし、私が推測できることは次のとおりです。

プログラム 1:

Begin Invoke は非同期的にメソッドを呼び出す方法です。したがって、最後に表示される結果は 1 つだけです。VS でゆっくりと F11 を実行して観察すると、結果が 4 になるたびに結果が得られるわけではありません。マルチスレッドが常に同じように動作することは決してないことを覚えておく必要があります。つまり、マルチスレッドのアプリケーションまたはモジュールが一度に 1 つの結果、2 つの結果、または 10 回の結果を返す場合、それが正しいかどうか確信が持てないことを意味します。または最適化されたコード。クライアント環境では、独自の動作により、デバッグ中に気付かない可能性がある、または発生しない可能性のある異なる結果につながる可能性があるためです。素敵なブログで読みました。

プログラム 2:

そのマルチスレッド化以来、異なるスレッドが異なる時間に呼び出される動作を見ることができました。それが仕事をしていると、テキストボックスが数秒ですばやく更新されていることがわかります。これは人間の目では気付くことができませんが、最終結果、単一の数字が表示されます。また、クロス スレッド呼び出しをチェックします)F11 を使用してコードのすべての行にステップ インすると、この動作を見つけてよく理解できます)、それをキャッチしないように命令します。これにより、2 番目のケースでスレッドが連携します。

これは私の推測ですが、かなり陳腐だと言えます。私はこれを自信を持って主張していませんが、私の観察です:)

私たちを助けるために、何人かの偉大な人々に彼らの意見を聞かせてください:)

乾杯

于 2013-03-22T21:17:41.977 に答える