Как отобразить индикатор выполнения, если используется waithandle - PullRequest
1 голос
/ 03 декабря 2008

Где-то в коде waitHandle используется для выполнения некоторых действий. Однако с помощью waithandle форма зависает в ожидании завершения какого-либо действия. Поэтому следующий код не будет работать:

frmProgressBar.show();
int successOrFail = PerformSynchronousActionUsingWaitHandle();
frmProgressBar.close();
frmMainScreen.show();

Это не сработает, так как вместо этого будет заморожен frmProgressBar. Мне действительно нужно сохранить строку № 1, строку № 3 и строку № 4, но как мне переписать PerformSynchronousActionUsingWaitHandle () так, чтобы операция все еще была синхронной, а индикатор выполнения отображался. Возможно, мне удастся обойти это, показывая индикатор выполнения в другом потоке, но дизайн системы таков, что это будет очень грязно.

Ответы [ 4 ]

1 голос
/ 03 декабря 2008

вы хотите запустить PerformSynchronousActionUsingWaitHandle в потоке, чтобы он не блокировал поток пользовательского интерфейса.

    public event EventHandler<WorkCompleteArgs> WorkComplete;
    private void StartClick(object sender, EventArgs e)
    {
        //hook a complete event
        this.WorkComplete += new EventHandler(OnWorkComplete);

        //do start code

        //run the PerformSynchronousActionUsingWaitHandle process in a thread
        Thread thread = new Thread(new ThreadStart(PerformSynchronousActionUsingWaitHandle));
        thread.Start();
    }
    private void OnWorkComplete(object sender, EventArgs e)
    {
        //cross thread
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler(OnWorkComplete), new object[] { sender, e });
            return;
        }

        //un hook
        this.WorkComplete -= new EventHandler(OnWorkComplete);

        //do complete code

    }
    private void PerformSynchronousActionUsingWaitHandle()
    {
        Thread.Sleep(1000);
        if (WorkComplete != null)
        {
            //use event args to return the functions result if needed.
            WorkComplete(this, new WorkCompleteArgs(true));
        }
    }

    public class WorkCompleteArgs
    {
         public WorkState {get;private set;}
         public WorkCompleteArgs(bool workState)
         {
             this.WorkState = workState;
         }
    }
1 голос
/ 03 декабря 2008

Разве вы не можете использовать класс BackgroundWorker? http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

0 голосов
/ 03 декабря 2008

Вы пытались использовать класс BackgroundWorker вместо этого? Вам нужно будет переписать метод, выполняя синхронную задачу.

0 голосов
/ 03 декабря 2008

Используйте два разных потока для обработки этого ... один поток для индикатора выполнения и один поток для PerformSynchronousActionUsingWaitHandle () .. Надеюсь, это каким-то образом поможет

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