2012-03-14 3 views
0

vs2010 및 로컬 database.In있는 C# Windows 응용 프로그램에서 일하고 있어요 내 양식 중 하나를 사용하여 BindingNavigator 데이터베이스 및 ReporViewer 채워진 텍스트 상자 그룹을 사용합니다. 데이터베이스에 많은 레코드가있는 경우 테이블 어댑터를 채우기 위해 백그라운드 작업자를 추가했습니다.BackgroundWorker In Form.Load 이벤트

문제는 내 응용 프로그램을 디버깅 할 때 백그라운드 작업자를 사용하고있어 텍스트 상자의 데이터를 볼 수 없다는 것입니다. 그렇지 않으면 내 응용 프로그램을 실행할 때 정상적으로 작동합니다. 이것이 UI가 아닌 스레드에서 UI에 액세스하는 경우이며 잘못된 것입니다. 그 주위에 다른 방법이 있습니까? 미리 감사드립니다.

private void Client_Load(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    this.clientTableAdapter.Fill(this.database1DataSet.Client); 
    this.projectTableAdapter.Fill(this.database1DataSet.Project); 

    if (InvokeRequired) 
    { 
     this.Invoke(new MethodInvoker(this.reportViewer1.RefreshReport)); 
     return; 
    } 
} 
+0

디버그 모드에서 예외가 있습니까? –

답변

1

일반적으로 배경 작업자가 동일한 스레드에서 반환하고, 실제로 비 UI 스레드에 대한 예외를 슬로우 : 여기

내가 사용하고 코드입니다. 그러나 이것은 귀하의 경우에 먹을 수 있습니다. 주요 작업이 완료된 후, 특히 UI를 업데이트 할 때 발생할 항목에 대해서는 RunWorkerCompleted 이벤트를 사용해야합니다. 그리고,이 은 위에서 언급 한 것처럼 (귀하의 경우에는 UI)에서 호출 된 동일한 스레드로 돌아 가야합니다.

그래서 UI 처리 코드 (RefreshReport)를 RunWorkerCompleted에 설정된 새 메서드로 옮깁니다.

그러나 내 제안은 Task Parallel Library을 살펴 보는 것입니다. 코드를 훨씬 더 깔끔하고 쉽게 작성하여 IMO를 디버그합니다.

예 (거친과 널 (null)로 인해 컴파일하지 않을 수 있습니다,하지만 당신은 JIST : 얻을 수 있습니다) : 나는 그 직접적인 대답은 아니라는 것을 알고,하지만 대한 제안의 더

var task = Task.Factory.StartNew(()=>{//Do Async Stuff}); 
task.ContinueWith((previousTask)=>{//Do your UI Stuff}, null, null, 
    TaskScheduler.FromCurrentSynchronizationContext); 
//The FromCurrentSync makes sure the method returns 
//to the same thread (UI in this case) that it started 

를 I 더 깔끔하고, 더 디버깅 가능한 접근법을 고려할 것이다.

+0

답장을 보내 주셔서 감사합니다. 그러나 저는이 자료에 비교적 익숙하기 때문에 좀 더 직접적인 대답이 필요합니다. 내 질문은 backgroundADerDoWork 이벤트에서 tableadapter.Fill()을 사용할 수 있습니까? 위의 코드가 맞습니까? – MarcusV

+0

다음과 같이 사용했지만 아직 알아 내지 못했습니다. public Task FillAync() { return Task.Factory.StartNew (() => {this.clientTableAdapter.Fill (this.database1DataSet.Client); this .projectTableAdapter.Fill (this.database1DataSet.Project); this.reportViewer1.RefreshReport(); }); } – MarcusV

+0

이제 자세히 살펴 보겠습니다. 귀하의 특정 시나리오에 대한 답변을 업데이트하겠습니다. 그러나, 나는 여전히 TPL을 조사 할 것을 강력히 제안 할 것입니다. 이전 기술을 사용하는 이유는 무엇입니까? –