2012-03-14 5 views
1

x(変更)秒後にデータベーステーブルYのデータが変更されるプロセスを開始するフォームにボタンがあります。InitializeGridView()前述のテーブルYを示すDGVをリフレッシュします。問題は、プロセスの前にInitializeGridView()が終了するため、プロセスによって加えられた変更が反映されないことです。 InitializeGridViewをプロセスが完了するまで待機させるにはどうすればよいですか?タイミングの問題 - プロセスがデータを修正する前にDGVがリフレッシュされる

private void btRunProcessAndRefresh_Click(object sender, EventArgs e){ 
    Process.Start(@"\\fileserve\department$\ReportScheduler_v3.exe", "12"); 
    InitializeGridView(); 
} 

EDIT

私は次のようになってしまいました。問題は、プロセスが10分かかると、アプリケーションは10分間凍結されるということです。私はマルチスレッドの方法を学ぶ必要があると思う!

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(); 
    } 

答えて

1

が私の答えのコピーです:

あなたInitialilzeGridViewを(必要な場合)メソッドは、プロセスの後に実行します終了しました:

  1. Dispatcher.CurrentDispatcherを_currentDispatcherとして利用可能にします。
  2. プロセスを別のスレッドで開始し、そこにWaitForExit()を持ってください。
  3. スレッドをInitializeGridview()メソッド_currentDispatcher.BeginInvoke経由で呼び出してください。

    注:あなたは、プロジェクトの[参照の追加]ダイアログを経由してWindowsBaseへの参照を追加する必要があります

は、ここであなたが軌道に乗るためにいくつかのコードです。

using System; 
using System.Diagnostics; 
using System.Threading; 
using System.Windows.Forms; 
using System.Windows.Threading; 

private readonly Dispatcher _currentDispatcher = Dispatcher.CurrentDispatcher; 
private delegate void ReportingSchedulerFinishedDelegate(); 

private void btRunReport_Click(object sender, EventArgs e) 
{ 
    btRunReport.Enabled = false; 
    btRunReport.Text = "Processing.."; 
    var thread = new Thread(RunReportScheduler); 
    thread.Start(); 
} 

private void InitializeGridView() 
{ 
    // Whatever you need to do here 
} 

private void RunReportScheduler() 
{ 
    Process p = new Process(); 
    p.StartInfo.FileName = @"\\fileserve\department$\ReportScheduler_v3.exe"; 
    p.StartInfo.Arguments = "12"; 
    p.Start(); 
    p.WaitForExit(); 
    _currentDispatcher.BeginInvoke(new ReportingSchedulerFinishedDelegate(ReportingSchedulerFinished), DispatcherPriority.Normal); 
} 

private void ReportingSchedulerFinished() 
{ 
    InitializeGridView(); 
    btRunReport.Enabled = true; 
    btRunReport.Text = "Start"; 
} 
0

Process.Startの戻り値でWaitForExitを呼び出すことができます。

+0

ありがとうございます。Nico - 私はHenkの投稿で提供されているコードを編集しました。本当に問題のポストのコードを修正しているはずですが、私はうまくいけにえだとうまくいけにえです。 – whytheq

1

プロセスでp.WaitForExit()を呼び出すことはできますが、メインスレッド(buttonClickなど)では実行しないでください。

あなたが好きなものをお勧めします:フォローアップの質問はそうここに閉鎖された

//untested 
private void btRunProcessAndRefresh_Click(object sender, EventArgs e) 
{ 
    var p = Process.Start(@"\\fileserve\department$\ReportScheduler_v3.exe", "12"); 
    p.Exited += ProcessExited; 
    p.EnableRaisingEvents = true; 
    //InitializeGridView(); 
}  

void ProcessExited(object sender, EventArgs e) 
{ 
    InitializeGridView();  
} 
+0

p.Exited = ProcessExited; + =または - = – whytheq

+0

の左側にのみ存在することができます。この例は、初心者には退屈だがトリッキーです。http://127.0.0.1:47873/help/1-7768/ms.help?product=VS&productVersion = 100&method = f1&query = System.Diagnostics.Process.Exited&locale = en-US&カテゴリ= DevLang%3acsharp%00TargetFrameworkMoniker%3a.NETFramework、Version%3Dv4.0 – whytheq

+0

私が言ったように: '//未テスト ' –

関連する問題