21

ラベルを更新するために、別のクラスでスレッド書き込みを使用しています。ラベルは Winform Main クラスの内容です。

 Scanner scanner = new Scanner(ref lblCont);
 scanner.ListaFile = this.listFiles;
 Thread trd = new Thread(new ThreadStart(scanner.automaticScanner));
 trd.IsBackground = true;
 trd.Start();
 while (!trd.IsAlive) ;
 trd.Join();

ご覧のとおり、ラベルの参照を 2 番目のクラスのコンストラクターに渡します。2 番目のクラス (スキャナー) には、次のコードでラベルを更新する「automaticScanner」というメソッドがあります。

public Scanner(ref ToolStripStatusLabel _lblContatore)
{
        lblCounter= _lblContatore;
}
Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter));
threadUpdateCounter.IsBackground = true;
threadUpdateCounter.Start();
while (!threadUpdateCounter .IsAlive) ;
threadUpdateCounter.Join();

private void AggiornaContatore()
{
  this.lblCounter.Text = this.index.ToString();        
}

ラベルの更新時に次のエラーが表示されました。

クロススレッド操作が無効です: コントロール 'Main' は、それが作成されたスレッド以外のスレッドからアクセスされました

Winform C# で .net 4 を使用しています。

回答ありがとうございます。

ニュース: 問題は次の行です。

trd.Join();

この行は GUI をブロックし、ラベルは更新されませんでした。スレッドの終了を制御し、最後までラベルを更新する方法はありますか? ありがとう

4

3 に答える 3

52

UI スレッド以外のスレッドから UI を更新することはできません。これを使用して、UI スレッドのスレッドを更新します。

 private void AggiornaContatore()
 {         
     if(this.lblCounter.InvokeRequired)
     {
         this.lblCounter.BeginInvoke((MethodInvoker) delegate() {this.lblCounter.Text = this.index.ToString(); ;});    
     }
     else
     {
         this.lblCounter.Text = this.index.ToString(); ;
     }
 }

スレッド化について明確な全体像をつかむために、この本のこの章とその他の章を読んでください。

http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications

于 2013-02-15T07:56:10.027 に答える
11

別のスレッドでラベル テキストを更新するには、 MethodInvokerを使用します。

private void AggiornaContatore()
{
    MethodInvoker inv = delegate 
    {
      this.lblCounter.Text = this.index.ToString(); 
    }

 this.Invoke(inv);
}

UI スレッドがラベルを保持しているため、エラーが発生しています。また、別のスレッドを介してラベルを更新しようとしているため、クロススレッド例外が発生しています。

次も参照してください: Windows フォームでのスレッド化

于 2013-02-15T07:55:02.487 に答える
3

Control.Invoke MethodまたはControl.BeginInvoke Methodを使用してください。

良い例: How to: Make Thread-Safe Calls to Windows Forms Controls

于 2013-02-15T07:55:59.563 に答える