В чем разница между вариантами 1 и 2 в следующем?
private void BGW_DoWork(object sender, DoWorkEventArgs e)
{
for (int i=1; i<=100; i++)
{
string txt = i.ToString();
if (Test_Check.Checked)
//OPTION 1
Test_BackgroundWorker.ReportProgress(i, txt);
else
//OPTION 2
this.BeginInvoke((Action<int, string>)UpdateGUI,
new object[] {i, txt});
}
}
private void BGW_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
UpdateGUI(e.ProgressPercentage, (string)e.UserState);
}
private void UpdateGUI(int percent, string txt)
{
Test_ProgressBar.Value = percent;
Test_RichTextBox.AppendText(txt + Environment.NewLine);
}
Глядя на отражатель, Control.BeginInvoke (), по-видимому, использует:
this.FindMarshalingControl().MarshaledInvoke(this, method, args, 1);
Который, кажется, в конечном итоге вызывает некоторые нативные функции, такие как PostMessage (), не может точно определить поток от рефлектора (надоедливая оптимизация компилятора)
Принимая во внимание, что BackgroundWorker.Invoke () используется:
this.asyncOperation.Post(this.progressReporter, args);
Который, кажется, в конечном итоге вызывает ThreadPool.QueueUserWorkItem ()
(Я просто предполагаю, что это соответствующие вызовы функций для каждого случая.) Если я правильно понимаю, использование ThreadPool не гарантирует порядок выполнения, тогда как использование механизма Post будет. Возможно, это будет потенциальная разница? ( РЕДАКТИРОВАТЬ - я не мог синтезировать такую ситуацию - порядок вызовов, кажется, сохраняется в обоих случаях, по крайней мере, в моих простых тестах.)
Спасибо!