2012-08-24 6 views
4

윈도우 폼이 있습니다. 나는 내가 이미지로드 중 문제 발생

PictureBox1.Visible = true; 

을 설정 한 버튼의 클릭 이벤트를 발사하고있는 동안 나는이

PictureBox1.Visible = false; 

을 설정 한 양식을로드 할 때

PictureBox 하나 개의 로딩 이미지를 넣어하지만 경우에 거기에있다 저장 프로 시저를 통해 데이터베이스에서 데이터를 검색하는 코드입니다.

저장 프로 시저에서 데이터를 검색하기위한 코드로 이동하면로드 이미지의로드가 중지됩니다.

발생해서는 안됩니다. 로드 중으로 표시되어야합니다. .gif 로딩 이미지를 사용했습니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

4

매번 당신은 당신이 BackgroundWorker에 사용해야 이벤트 핸들러 내에서 오래 지속 전화를 가지고! BackgroundWorker 은 코드 비동기을 실행할 수 있으므로 작업자 시작 직후 button_click eventHandler가 종료됩니다.

// add a BackGroundWorker bwLoadData to your form 

private void YOURBUTTON_Click(object sender, EventArgs e) 
{ 
    PictureBox1.Visible = true; 
    bwLoadData.RunWorkerAsync(); 
} 
private void bwLoadData_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // access your db, execute storedProcedue and store result to 
    e.Result = YOUR_DATASET_RECORDS_OR_ANYTHING_ELSE; 
} 
private void bwLoadData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Result != null) 
    { 
      // e.g. show data on form 
    } else { 
      // e.g. error message 
    } 
} 
0

가능한 이유는 이미지 및 데이터 검색을로드하여 동일한 스레드를 공유하기 때문일 수 있습니다. 따라서 멀티 스레딩 또는 비동기 호출을 시도하여 데이터를 가져올 수 있습니다. 아약스/javascipt 웹 작업자에 대한 이전 답변에 대한 미안 해요, 전 완전히 U 언급 된 Windows 양식을 무시.

+0

이있다 Windows 응용 프로그램, 내가 자바 스크립트 또는 아약스 –

+0

체크 아웃이 링크를 사용할 수 없습니다, 그것은 유용 할 수 있습니다 - http://www.yoda.arachsys.com/csharp/threads/winforms.shtml –

2

아마도 저장 프로 시저를 실행하는 동안 UI 스레드가 차단됩니다. 데이터베이스에서 데이터를 가져 오기 위해 BackGroundWorker을 사용하면 다른 스레드를 만들고 기본 스레드를 차단하지 않습니다.

또는 스레드를 수동으로 만들고이를 사용하여 데이터베이스에서 데이터를 검색 할 수 있습니다. Windows 양식에서는 모범 사례로 UI 스레드를 차단하지 않기 위해 외부 시스템 호출을 실행하는 데 다른 스레드를 사용하는 것이 좋습니다.

backgroundworker usage