문제

2009-12-17 7 views
0

내가이 말 다음 클래스/양식 (반 사이비) :이 당연히문제

public partial class X : Form 
{ 
    private DataTable dt; 
    private BackgroundWorker bg; 

    public X() 
    { 
     dt.Columns.Add("A"); 
     dt.Columns.Add("B"); 
     dt.Columns.Add("C"); 
    } 

    private void button_Click(...) 
    { 
     bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerAsync(); 
    } 

    private void bg_DoWork(...) 
    { 
     // do some stuff 
     MagicMethod(parameters); 

     // doesnt work, how to fix this? 
     dataGridView1.Invoke((Action)delegate { dataGridView1.DataSource = dt; }); 
    } 

    private void MagicMethod(params) 
    { 
     // update a label, WORKS 
     label1.Invoke((Action) delegate { label1.Text = "somestuff" } 

     // do some stuff to fill the datatable 
    } 
} 

인 증류수 버전의 경우 BackgroundWorker의 모든 사운드, 그러나없이 나는 더 반응 UI의 I를 원하기 때문에 하나를 구현하려고합니다. 그러나 그리드는 작업자에 의해 업데이트되지 않습니다 (레이블은 올바르게 작동합니다). 어떤 팁?

+0

짧지 만 완전한 * 예를 제공 할 수 있다면 쉽게 도움이 될 것입니다. –

+0

디버그> 예외> 공용 언어 런타임 예외> Throw하고 실패한 것을 확인하십시오. 당신이 제공 한 코드가 작동합니다. – jmservera

답변

1

어쩌면 어딘가에서 (아마도 MagicMethod 내부에서) 예외를 일으킬 수 있으며 Bgw RunWorkerCompleted 이벤트를 처리하지 않기 때문에 알 수 없습니다. dataGridView1.DataSource = dt;

this MSDN example 참조하고있는 경우/다른 사람에/경우주의 : 완성 된 이벤트는 결과를 처리 할 수있는 편리하고 안전한 장소입니다 e.Error != null

경우

그래서하는 RunWorkerCompleted 이벤트를 추가하고 확인 else 패턴은 RunWorkerCompleted 이벤트에 있습니다.

+0

나는 그것을 얻지 못한다. RunWorkerCompleted 이벤트에서 apparant 에러를 얻지 못한다. : – Oxymoron

+0

그리고'dataGridView1.DataSource! = null' 체크는 어떻게 완료 되었습니까? 우리는 수사 디버깅을하고 있습니다. –

+0

현지인을 확인할 때 데이터 소스에 52 개의 행이 있다는 것을 알았습니다. HasErrors가 false로 설정되었지만 여송연이 없습니다. 스레딩에 대한 나의 경험 부족은 여기에 실제로 표시됩니다. ( 나는이 질문에 답글에 코드를 게시했습니다. – Oxymoron