Estoy confundido con el escenario que he encontrado con el acceso de subproceso cruzado. Esto es lo que estoy tratando de hacer:¡BeginInvoke está bloqueando la UI mientras que Invoke no lo está!
principal interfaz de usuario de hilo - elemento de menú haga clic creo un trabajador de fondo y ejecutarlo de forma asíncrona
private void actionSubMenuItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem itemSelected = (ToolStripMenuItem)sender;
ExecuteTheActionSelected(itemSelected.Text);
}
El método ExecuteTheActionSelected
es el siguiente:
private void ExecuteTheActionSelected(string actionSelected)
{
BackgroundWorker localBackgroundWorker = new BackgroundWorker();
localBackgroundWorker.DoWork += new DoWorkEventHandler(localBackgroundWorker_DoWork);
localBackgroundWorker.RunWorkerAsync(SynchronizationContext.Current);
}
El localBackgroundWorker_DoWork
tiene:
ActionExecutionHelper actionExecutioner = new ActionExecutionHelper()
actionExecutioner.Execute();
El Execute
método en el que la clase que tiene el método invocador, que de hecho invoca el controlador de eventos en hilo de interfaz de usuario:
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
}
}
El controlador de eventos de interfaz de usuario es la siguiente:
private void executionProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (_dwExecuteAction != null)
{
_dwExecuteAction.ShowDataInExecutionWindow(e.Text);
}
}
Ahora aquí viene la cuestión de hilo cruzado :
public void ShowDataInExecutionWindow(string message)
{
if (rchtxtExecutionResults.InvokeRequired)
{
rchtxtExecutionResults.Invoke(new ShowDataExecutionDelegate(ShowDataInExecutionWindow), message);
}
else
{
this.rchtxtExecutionResults.AppendText(message + Environment.NewLine);
}
}
Aquí invocación no bloquea la interfaz de usuario donde como BeginInvoke bloques. Por favor, ayúdame a entender este escenario ya que estoy confundido mucho.
Me temo que no sé la respuesta, pero el enfoque que tomaría para descubrirlo sería observar cómo los múltiples niveles de invocación y los trabajadores de fondo interactúan entre sí, y donde todo se ejecuta realmente de manera que entiendes cómo todo encaja. –