2014-07-16 3 views
0

간단한 응용 프로그램이 있습니다. 나는 arraylist가 있고이 명부는 웹 사이트를 포함한다.스레딩이 실행되지 않습니다

버튼을 클릭 할 때 오류가 있습니다. 오류는 다음과 같습니다. 스레드 간 동작 잘못 : 아닌 다른 스레드로부터 액세스 제어 'listBox2'

'System.InvalidOperationException'형식의 첫째 예외가

추가 정보가 system.windows.forms.dll 발생 그것이 작성된 thread

이 예외 처리기가있는 경우 프로그램을 안전하게 계속할 수 있습니다.

코드는 다음과 같습니다 : 작동

private void getStatus(Object obj) { 
     MessageBox.Show((string)obj); 
    } 

: 내가 좋아하는 코드를 작성

private void button2_Click(object sender, EventArgs e) { 
     for (int i = 0; i < sitelist.Count; i++) { 
      Thread thread = new Thread(getStatus); 
      thread.Start((string)sitelist[i]); 
     } 
    } 
    private void getStatus(Object obj) { 
     listBox2.Items.Add("1"); 
    } 

. 왜 내가 목록 상자를 사용하면 오류가 표시됩니까?

감사합니다. Ömer.

+0

다른 스레드에서 UI에 액세스 할 수 없습니다. [이 게시물] (http://stackoverflow.com/questions/9625700/listening-serial-port-how-to-add-string-to-listbox/9625765#9625765) 또는 [this post] (http : /stackoverflow.com/questions/22890740/c-sharp-tcp-client-and-server-having-trouble/22890816#22890816) 또는 [this post] (http://stackoverflow.com/questions/10170448/how-to -invoke-a-ui-method-from-another-thread/10170699 # 10170699). –

+0

분명히,'MessageBox.Show' 메쏘드는리스트 박스와 같은 스레딩 제한을 가지고 있지 않습니다. 목록 상자를 다른 스레드에서 업데이트하는 방법을 묻는 것은 완전히 다른 질문입니다. –

+0

MessageBox는 주 스레드에서 생성 된 핸들에 액세스하지 않기 때문에 실패하지 않습니다. 예를 들어 CTRL + C를 누를 경우 –

답변

2

당신은 이유는 당신이 속성을 만지거나 주요 아닌 다른 스레드에서의 WinForm 컨트롤의 도면에 영향을 미칠 수 없다는 것입니다 BeginInvoke

private void getStatus(Object obj) { 
     this.BeginInvoke(new EventHandler((s,e)=>{listBox2.Items.Add("1")})); 
    } 

을 사용해야합니다. 메인 스레드로 콜백을 마샬링해야하고 Invoke/BeginInvoke가이를 수행합니다.

+0

+1하지만 더 간단한 MethodInvoker도 작동합니다.) –

+0

정말 고마워요. . – OEASLAN