2012-03-31 6 views
2

데이터베이스 테이블에서 열을 가져온 후 콤보 상자에 항목을 추가하려고합니다. 내가 새로 만든 스레드다른 스레드를 사용하여 데이터베이스에서 콤보 상자로 데이터로드

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
} 

에서이 작업을 배치 한 성능을 달성하지만 다음과 같은 예외 제공합니다 : 나는 그것을 검색 및 시도

"잘못된 크로스 스레드 작업을" 다른 방법의 도움으로이 문제를 해결하려면 대표자가 필요합니다. 전 dataTable 전체를 다른 메소드로 전달하려했지만 문제를 해결할 수 없었습니다.

어떻게 해결할 수 있습니까?

+0

WinForms 또는 WPF? – Tudor

답변

0

백그라운드 스레드에서 데이터베이스 쿼리를 실행할 수 있지만 UI 스레드에서 UI 컨트롤을 업데이트해야합니다. Windows가 작동하는 방식입니다.

0

스레드는 UI 스레드가 아닙니다. UI 스레드 만 콤보 상자와 같은 UI 컨트롤에 액세스 할 수 있습니다. 콤보 상자 항목을 업데이트하는 방법은 UI 스레드에서 호출되었는지 확인하고 콤보 상자를 사용하기 전에이를 전환해야합니다 (그렇지 않은 경우).

public delegate void OnAddTable(DataTable dataTable); 

private void AddTable(DataTable dataTable) 
{ 
    if(this.InvokeRequired) 
    { 
     this.BeginInvoke(new OnAddTable(AddTable), new object[] {dataTable})); 
     return; 
    } 
    for (int i = 0; i < dataTable.Rows.Count; i++) 
    { 
     comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
    } 
} 
3

단순히 BeginInvoke에 전달 대리인의 코드를 포장 :

comboBox.BeginInvoke(
    (Action)(() => 
    { 
     for (int i = 0; i < dataTable.Rows.Count; i++) 
     { 
      comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
     } 
    })); 

이 방법으로는 GUI에 변경을 할 수있는 유일한 스레드이기 때문에 당신의 GUI 스레드에 업데이트를 전달하고 있습니다.

관련 문제