Проблема синхронизации - DGV обновляется до того, как процесс исправляет данные - PullRequest
1 голос
/ 14 марта 2012

У меня есть кнопка в форме, которая запускает процесс, который после x (изменяется) секунд изменяет некоторые данные в таблице базы данных Y. Вызов InitializeGridView () затем обновляет DGV, который показывает ранее упомянутую таблицу Y.Проблема в том, что InitializeGridView () завершает работу до процесса, поэтому изменения, внесенные процессом, не отражаются.Как заставить InitializeGridView ждать завершения процесса?

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

РЕДАКТИРОВАТЬ

Я получил следующее.Проблема в том, что если процесс занимает 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();
    }

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Вы можете вызвать p.WaitForExit () для процесса, но не делайте этого в главном потоке (т. Е. При нажатии кнопки);

Вы хотите что-то вроде:

//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();    
}
1 голос
/ 15 марта 2012

Следующий вопрос был закрыт, поэтому вот копия моего ответа:

Если вам нужен метод InitialilzeGridView () для запуска после завершения процесса:

  1. Makeдоступны 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 голосов
/ 14 марта 2012

Вы можете вызвать WaitForExit для возвращаемого значения Process.Start.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...