Jestem zdezorientowany scenariuszem, który napotkałem podczas dostępu do wątków. Oto, co próbuję zrobić:BeginInvoke blokuje interfejs użytkownika, podczas gdy Invoke nie jest.!
Main UI wątek - pozycja menu kliknij tworzę tle Pracownik i uruchomić go asynchronicznie
private void actionSubMenuItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem itemSelected = (ToolStripMenuItem)sender;
ExecuteTheActionSelected(itemSelected.Text);
}
Sposób ExecuteTheActionSelected
się następująco:
private void ExecuteTheActionSelected(string actionSelected)
{
BackgroundWorker localBackgroundWorker = new BackgroundWorker();
localBackgroundWorker.DoWork += new DoWorkEventHandler(localBackgroundWorker_DoWork);
localBackgroundWorker.RunWorkerAsync(SynchronizationContext.Current);
}
Model localBackgroundWorker_DoWork
ma:
ActionExecutionHelper actionExecutioner = new ActionExecutionHelper()
actionExecutioner.Execute();
The Execute
metoda w tej klasie, która ma metody wywołującego które rzeczywiście wywołuje procedurę obsługi zdarzeń w wątku UI:
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
}
}
obsługi zdarzenia UI jest następująca:
private void executionProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (_dwExecuteAction != null)
{
_dwExecuteAction.ShowDataInExecutionWindow(e.Text);
}
}
Teraz Nadchodzi przekrój problem wątek :
public void ShowDataInExecutionWindow(string message)
{
if (rchtxtExecutionResults.InvokeRequired)
{
rchtxtExecutionResults.Invoke(new ShowDataExecutionDelegate(ShowDataInExecutionWindow), message);
}
else
{
this.rchtxtExecutionResults.AppendText(message + Environment.NewLine);
}
}
Tutaj Invoke nie blokuje UI gdzie jak BeginInvoke bloków. Proszę, pomóżcie mi zrozumieć ten scenariusz, ponieważ jestem bardzo zdezorientowany.
Obawiam się, że nie znam odpowiedzi, ale podejście, które podjąłbym, aby ją znaleźć, polegałoby na sprawdzeniu, w jaki sposób wielopoziomowe poziomy inwokacji i pracownicy pracujący w tle wchodzą ze sobą w interakcje i gdzie wszystko faktycznie jest wykonywane, więc że rozumiesz, jak wszystko pasuje do siebie. –