2011-09-20 10 views
2

winform 응용 프로그램을 개발 중이며 데이터베이스에서 요청을하고 비동기식으로 채울 수 있지만 다른 스레드의 코드이기 때문에 액세스 제어 문제가 있습니다. 코드는 다음과 같습니다.Linq to Sql combobox async 결과가

this.backWorker.DoWork + = delegate 
      { 
       comboBoxUsers.DataSource = repositoryUser.SelectAll(); 
       comboBoxUsers.ValueMember = "UserId"; 
       comboBoxUsers.DisplayMember = "Name"; 
      }; 

      backWorker.RunWorkerAsync(); 

내가 envoke에 대해 공부하지만이를 구현하는데 문제가 있어요, 내가 할 필요가 는 DoWork 이벤트 보이는 진행률 표시 줄을 떠나이 일을 선택했다.

답변

3

BackgroundWorker에서 저장소를 쿼리하고 ProgressChangedEvenHandler를 통해 결과를 UI로 반환

//Set the ComboBox Properties on the Form, not in the worker. 
    comboBoxUsers.ValueMember = "UserId"; 
    comboBoxUsers.DisplayMember = "Name"; 

    BackgroundWorker = new BackgroundWorker(); 
    worker.DoWork += Worker_DoWork; 
    worker.WorkerReportsProgress = true; 
    worker.ProgressChanged += new ProgressChangedEventHandler(Worker_ProgressChanged); 

    private void Worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgrounderWorker worker = (BackgroundWorker)sender; 

     //Query the database 
     //Instantiate a custom-class to contain the results 
     IList<Users> users = userRepository.SelectAll(); 
     QueryResults results = new QueryResults(users); 
     worker.ReportProgress(0, results); 
    } 

    //Back In the UI Layer 
    private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     var result = (QueryResult)e.UserState; 
     comboBoxUsers.DataSource = result.Users; 
    } 
+0

또한 ComboBox의 ValueMember 및 DisplayMember가 절대로 변경되지 않으면 양식의 생성자 또는 관련 designer.cs 파일 자체에서 변경할 수 있습니다. 진심으로 신경 쓰는 유일한 방법은 쿼리 결과를 주 스레드로 반환하는 것입니다. – Dubs

0

대리인은 다음과 같이 기록한다 :

여기에서 볼 다른 스레드에서 UI 스레드의 UI 컨트롤에 액세스하는 방법에 대한 자세한 내용은
this.backWorker.DoWork += delegate(object s, DoWorkEventArgs args) 
{ 
    //... 
} 

: 명확한있다

Access windows control from Backgroundworker DoWork

해당 링크의 답변 : 여기에 스 니펫 :

this.Invoke(new MethodInvoker(delegate { 

    // This code executes on the GUI thread. 

})); 
+0

잘 모르겠지만 어떻게 콤보 박스에 액세스합니까? – fernando