2014-01-15 4 views
0

주 폼에 Listbox가 있습니다. 두 번째 스레드에서 listbox에 액세스 할 수있는 메서드를 호출하고 싶습니다. 코드 :winforms의 비동기 메서드가 작동하지 않습니다.

......... 
SecThreadOp sc; 
......... 
sc = new SecThreadOp(this.listBox1); 
......... 
private void button1_Click(object sender, EventArgs e) 
    { 
     sc.thr1.Start(); 
    } 

응용 프로그램은 클릭 버튼 후 중단,하지만 난 목록 상자 비동기에서 '시험'을 표시하려면 :

class SecThreadOp 
{ 
    public Thread thr1; 
    private ListBox listb1= new ListBox(); 
    public SecThreadOp(ListBox lb) 
    { 
     thr1 = new Thread(write); 
     listb1 = lb; 
    } 

    public void write() 
    { 
     if (listb1.InvokeRequired) 
     { 
      listb1.Invoke(new Action(write)); 
     } 
     else 
     { 
      for (int i = 0; i < 20; i++) 
      { 
       listb1.Items.Add("testing"); 
       Thread.Sleep(2000); 
      } 
     } 
    } 

} 

및 주요 형태로는 내가 도착했습니다.

감사합니다.

+0

어떤 오류가 발생합니까? – wondra

+0

errros가 없으므로 버튼을 클릭하면 응용 프로그램이 일시 중지됩니다. –

+0

@ user3197850 else 블록은 UI 스레드에서 실행됩니다. 스레드에서 먼저 계산 (Thread.Sleeps)을 수행 한 다음 끝에 * write *를 호출하십시오. –

답변

1

백그라운드 스레드에서 write()를 다시 호출하는 것처럼 보입니다. Invoke에서 UI 스레드의 ListBox을 업데이트하려고한다고 가정합니다. 다음과 같이하십시오.

+0

+1. 다시 UI 스레드로 제어권을 넘겨주고 결과적으로 UI 스레드의 'Sleep'은 앱이 정지 될 것입니다. –

+0

왜이 백그라운드 스레드를 잠자기 하시겠습니까? –

관련 문제