2012-03-15 2 views
-2

가능한 중복 : 나는 데이터베이스 테이블 X. InitializeGridView를 업데이트합니다 다음 코드를루틴을 스레드로 분할하는 방법은 무엇입니까?

private void btRunReport_Click(object sender, EventArgs e){ 

    Process p = new Process(); 
    p.StartInfo.FileName = @"\\fileserve\department$\ReportScheduler_v3.exe"; 
    p.StartInfo.Arguments = "12"; 
    p.Start(); 
    p.WaitForExit(); 
    InitializeGridView(); 
} 

페이지를 가지고
Timing issue - DGV refreshes before process amends the data

테이블을 반영하는 DGV를 업데이트 X.

문제는 p가 실행하는데 10 분이 걸린다면 winForm은 InitializeGridView()에 도달하기 전에 얼어 붙습니다. 내가 도움이 필요한 것은 어떻게 양식을 만들어 배후에서 작동하고 InitializeGridView()를 실행하는 별도의 스레드에서 프로세스를 시작합니까?

+0

스레드를 앞쪽으로 다시 시작할 수없고 프로세스를 시작하기 위해 스레드를 시작하는 것이 무의미합니다. p.WairForExit 코드가 없으면 코드가 InitializeGridView()로 계속 진행됩니다. 곧. –

+0

C# 4.0의 [Threading in C#] (http://www.albahari.com/threading/)을 간단히 읽으십시오. 여러분이하려는 것은 대부분 쉽습니다. ** 편집 ** : 당신이 exe를 실행하려고했다는 사실을 놓쳤습니다. 좋은 기사 인 것 같습니다. – akiller

+0

이 작업을 수행하고 안전한 취소를 용이하게하는 유일한 방법은 별도의 AppDomain을 사용하는 것입니다. – MoonKnight

답변

1

은 프로세스가 완료된 후 실행하도록 InitialilzeGridView() 메소드가 필요한 경우 : _currentDispatcher로 Dispatcher.CurrentDispatcher 사용할 수

  1. 만들기를.
  2. 별도의 스레드에서 프로세스를 시작하고 거기에 WaitForExit()을 갖습니다.
  3. 스레드로 InitializeGridview() 방법을 _currentDispatcher.BeginInvoke 통해 호출하십시오.

    참고 : 당신은 당신의 프로젝트의 참조 추가 대화 상자를 통해 WindowsBase에 대한 참조를 추가해야합니다

다음은 가야하는 몇 가지 코드입니다.

+0

까지 - 당신의 솔루션은 완벽하게 작동하는 것 같다 - 지금 어떻게 작동하는지 알아보기 위해 그것을 조사해야한다! – whytheq

+0

꽤나 간단합니다 : 장기 실행 RunReportSchedule을 자체 스레드에서 실행하십시오. 백그라운드 스레드의 문제점은 메인 GUI 스레드가 직접 처리하는 요소에 직접 액세스 할 수 없다는 것입니다. _currentDispatcher는 GUI 스레드에서 디스패처에 대한 참조를 보유하고 데이터 준비를 마친 후 델리게이트를 통해 ReportSchedulerFinished를 실행하기위한 지침을 전달할 수 있습니다. – Till

관련 문제