BeginInvoke блокирует пользовательский интерфейс, а Invoke — нет.!

Меня смущает сценарий, с которым я столкнулся при доступе между потоками. Вот что я пытаюсь сделать:

Основной поток пользовательского интерфейса -щелчок по пункту меню Я создаю фонового рабочего и запускаю его асинхронно

private void actionSubMenuItem_Click(object sender, EventArgs e)
{
       ToolStripMenuItem itemSelected = (ToolStripMenuItem)sender;
       ExecuteTheActionSelected(itemSelected.Text);
}

Метод ExecuteTheActionSelectedвыглядит следующим образом:

private void ExecuteTheActionSelected(string actionSelected)
{
      BackgroundWorker localBackgroundWorker = new BackgroundWorker();
      localBackgroundWorker.DoWork += new DoWorkEventHandler(localBackgroundWorker_DoWork);
      localBackgroundWorker.RunWorkerAsync(SynchronizationContext.Current);
}

localBackgroundWorker_DoWorkимеет:

 ActionExecutionHelper actionExecutioner = new ActionExecutionHelper()
 actionExecutioner.Execute();

Метод Executeв этом классе, у которого есть вызов метода, который фактически вызывает обработчик событий в потоке пользовательского интерфейса:

 public void Execute()
 {
      // ---- CODE -----
      new MethodInvoker(ReadStdOut).BeginInvoke(null, null);
 }

 protected virtual void ReadStdOut()
 {
      string str;
      while ((str = executionProcess.StandardOutput.ReadLine()) != null)
      {
          object sender = new object();
          DataReceivedEventArgs e = new DataReceivedEventArgs(str);
          outputDataReceived.Invoke(sender, e); 
          //This delegate invokes UI event handler
      }
 }

Обработчик событий пользовательского интерфейса выглядит следующим образом:

private void executionProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (_dwExecuteAction != null)
    {
        _dwExecuteAction.ShowDataInExecutionWindow(e.Text);
    }
}

Теперь возникает проблема перекрестного потока:

public void ShowDataInExecutionWindow(string message)
{
     if (rchtxtExecutionResults.InvokeRequired)
     {
            rchtxtExecutionResults.Invoke(new ShowDataExecutionDelegate(ShowDataInExecutionWindow), message);
     }
     else
     {
            this.rchtxtExecutionResults.AppendText(message + Environment.NewLine);
     }
}

Здесь Invoke не блокирует пользовательский интерфейс, тогда как BeginInvoke блокирует . Пожалуйста, помогите мне понять этот сценарий, так как я сильно запутался.

6
задан Nagaraj Tantri 8 May 2012 в 12:14
поделиться