1

次のエラーがあります:クロススレッド操作が無効です:「コントロール 'progressBar1' は、それが作成されたスレッド以外のスレッドからアクセスされました。」私はそれを修正する方法を理解できないようです。

    private void button1_Click(object sender, EventArgs e)
    {
        this.panel1.Visible = false;
        this.panel2.Visible = true;
        new Thread(ProgressBAR).Start();
    }
    private void ProgressBAR()
    {
        Thread.Sleep(5);
        for (int start = 0; start <= 100; start++)
        {
            this.progressBar1.Value = start;
            Thread.Sleep(5);
        }
    }
4

3 に答える 3

3

これを試して:

private void button1_Click(object sender, EventArgs e)
{
    this.panel1.Visible = false;
    this.panel2.Visible = true;
    new Thread(ProgressBAR).Start();
}

private void ProgressBAR()
{
    Thread.Sleep(5);
    for (int start = 0; start <= 100; start++)
    {
        this.Invoke(new Action(() => this.progressBar1.Value = start));
        Thread.Sleep(5);
    }
}

OS の制限により、作成されたスレッド以外のスレッドから UI 要素にアクセスすることはできません。への呼び出しは、呼び出しを同期的に呼び出して、メイン スレッドで の値Invokeを更新します。ProgressBar

于 2013-04-10T17:50:23.243 に答える
2

Invokeコントロールのプライマリ スレッドで割り当てを実行するには、プログレス バーのメソッドを使用する必要があります。

this.progressBar1.Invoke((Action) () => this.progressBar1.Value = start, null);

が true の場合にのみ、これを行う必要progressBar1.InvokeRequiredがあります。この拡張クラスの使用を検討してください(恥知らずな自己宣伝、申し訳ありません)。次に、正しいスレッドにいるかどうかを忘れることができます。

this.progressBar1.AutoInvoke(() => this.ProgressBar1.Value = start);
于 2013-04-10T17:51:21.273 に答える
-1

コントロールの基になるウィンドウ ハンドルを所有するスレッドで、指定されたデリゲートを実行する必要があります。

詳細については、 Control.Invokeを参照してください。

これを試して:

private void button1_Click(object sender, EventArgs e)
{
   this.panel1.Visible = false;
   this.panel2.Visible = true;
   new Thread(ProgressBAR).Start();
}

private void ProgressBAR()
{
   Thread.Sleep(5);
   for (int start = 0; start <= 100; start++)
   {
      this.Invoke(new Action(() => this.progressBar1.Value = start));
      Thread.Sleep(5);
   }
}
于 2013-04-10T17:50:42.530 に答える