В чем разница между вариантами 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 гарантирует. Может быть, это и есть разность потенциалов? (EDIT - я не мог синтезировать такую ситуацию - порядок вызовов, кажется, сохраняется в обоих случаях, по крайней мере, в моих простых тестах.)
Спасибо!