2012-08-15 2 views
1

이 코드는 데이터가로드되기 전에 양식을로드 할 수 있지만 데이터가로드 될 때까지 단추 및 DataGridview 자체와 같은 폼의 일부 구성 요소는 "보이지 않습니다".비동기 적으로 데이터 그리드 뷰에 데이터를로드하는 가장 좋은 방법은 무엇입니까?

이 문제를 어떻게 해결합니까?

private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(delegate() 
     { 
      this.Invoke(new MyDelegate(delegate() 
      {    
       ReadXml(path); 
       Bind(); 
      }));    
     })); 

     t.Start(); 
    } 

    private void Bind() 
    { 
     dataGridView1.DataSource = table; 
    } 

이 코드는 더 잘 작동하지만 2 개의 새로운 스레드를 사용해야합니다. 이렇게하는 것이 최선의 방법 일 수는 없습니다.

private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(delegate() 
      { 
       this.Invoke(new InvokeDelegate(delegate() 
       { 
        Thread t2 = new Thread(new ThreadStart(delegate() 
        { 
         ReadXml(path); 
        })); 
        t2.Start(); 
        t2.Join(); 
        Bind(); 
       })); 
      })); 

     t.Start(); 
    } 
+1

* 양식로드시 실행되는 * 유일한 * 코드 인 경우 모든 것이 완벽하고 원활하게 작동해야합니다. 이 시점에서 UI를 차단하는 뭔가가 있습니다. 그것을 확인하십시오 ... – Tigran

+0

** 또는 ** 해당 메소드가 실제로 UI에 데이터를 저장하는 경우 * Bind() 메소드가 표시됩니다 * 차단 호출 일 수 있습니다. – Tigran

+0

그게 내 Form1_Load 이벤트 처리기 프로 시저에만 있습니다. 바인딩() 그냥이 않습니다 : dataGridView1.DataSource = table; –

답변

1

Invoke() 대신 BeginInvoke()를 사용하면 위임의 코드가 현재 UI 스레드에서 실행되지만 모든 현재 UI 작업이 보류 상태 (예 : 현재 Form1_Load 호출)가 될 때까지는 실행되지 않습니다. Invoke는 동기 호출이므로 스레드가 필요한 이유입니다.

void Form1_Load(object sender, EventArgs e) 
    { 
     this.BeginInvoke(new MyDelegate(delegate() 
     { 
      ReadXml(path); 
      Bind(); 
     })); 
    } 
+0

코드 블록을 제공하는 대신 답변에 대한 설명을 제공하십시오. 다른 사용자가 현지화 된 문제를 해결하는 대신 해답을 이해하는 데 도움이됩니다. 감사! – Conner

+0

좋은 지적이지만, 위의 의견에 있었기 때문에 나는 신경 쓰지 않았지만 누군가가 반드시 그들과 교신하지 않을 곳을 볼 수 있습니다. –

2

양식 타이머 (시스템 타이머 아님)는 다른 모든 메시지를 처리하기 전에 처리합니다.

100-250 밀리 초 간격으로 지정하십시오. 디자이너에서 enabled = false로 설정하십시오. form_load 이벤트에서 enabled = true로 설정하십시오. timer_tick 이벤트에서 첫 번째 행을 timer.enabled = false로 만듭니다. (여전히 틱 이벤트에서) 그리드를로드하십시오.

+0

이것은 해킹처럼 보이지만 적어도 작동합니다. 네가 이겼다. –

관련 문제