2011-10-17 10 views
0

可能ですか?たとえば、スレッドの実行時にラベルに新しい値を設定する必要があります。
私はこれを試してみました:スレッド実行中のラベルに新しい値を設定する

private void button1_Click_1(object sender, EventArgs e) 
{ 
    Thread th = new Thread(new ThreadStart(DoWork)); 
    th.Start(); 
} 

public void DoWork() 
{ 
    while (true) 
    { 
     StartSearch(path, ref httpRequest); 
    } 
} 

    public void StartSearch(string path, ref HttpWebRequest httpRequest) { 
        foo.GetTopic(path, delegate(string post, string name, string uid) 
        { 
         { 
          if (post.Contains("<font color=\"#0000FF\">")) 
          { 
           string msg = string.Format("Post:{0}\r\nby {1}({2})", post, name, uid); 
           //MessageBox.Show(msg); 
           labelX.text = msg; 
          } 
         } 
        } 
      ); 
     } 

私は次のようなエラーになっている:私はこれを行う方法

Cross-thread operation not valid: Control 'labelX' accessed from a thread other than the thread it was created on.

を?前もって感謝します!

+0

可能なdup? http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c – gbianchi

答えて

4

uiスレッド(ラベルを作成したスレッド)が実行するように呼び出す必要があります。その簡単、以下を試してみてください...

delegate void SetLabel(string msg); 

    void SetLabelMethod(string msg) 
    { 
     labelX.text = msg; 
    } 


this.Invoke(new SetLabel(SetLabelMethod), new object { msg }); // this is your form 
+0

ありがとう! :) –

3

anonymous methodを使用して、あなたの新しいスレッドでdelegateを呼び出します

あなたは background workerを使用することができます
this.Invoke((MethodInvoker) delegate { 
    labelX.Text = msg; 
}); 
1
labelX.Invoke(new Action(() => labelX.Text = msg)); 
-1

。レポートの進行状況で、ラベルの値を変更します。

+2

あなたはもっと説明できますか?たぶんコード例? –

関連する問題