2013-09-01 2 views
0

내 코드에서 오류가 발생합니다 :스레드 내부에서 listbox를 업데이트하는 방법은 무엇입니까?

크로스 스레드 작업 유효하지 않습니다 :

: 그것은

코드에 만들어진 스레드가 아닌 다른 스레드에서 액세스 제어 '에 ListBox1'

private void button2_Click(object sender, EventArgs e) 
{ 
    Thread t1 = new Thread(mult); 
    t1.Start(); 
} 
public void mult() 
{ 
    FileStream fq = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); 
    StreamReader s = new StreamReader(fq); 
    while (!s.EndOfStream) 
    { 
     Thread.Sleep(500); 
     listBox1.Items.Add(s.ReadLine()); //error at this line 

    } 

    s.Close(); 

답변

0

DOT-NET에서는 사용자가 만든 스레드에서 UI 요소를 수정할 수 없습니다. 컨트롤을 만든 기본 스레드 만 수정할 수 있습니다. 즉, 새 스레드 내에서 목록 상자 항목을 업데이트 할 수 없습니다.

BackgroundWorker과 같은 다른 전략이 있습니다. plese는 @Rotem이 게시 된 링크를보고 BackgroundWorker도 google에 올립니다.

업데이트 : 링크를 따라 가서 ListBox1.Invoke() 방식으로 결정하면 Invoke 대신 BeginInvoke을 사용하는 것이 좋습니다.

0

주위에 목록 상자를 업데이트하십시오.

this.Invoke(new MethodInvoker(delegate() 
{ 
//stuff 
})); 
관련 문제