以下是1和2选项的区别:
1. 如果您选择选项1,则将使用默认设置来执行操作。 2. 如果您选择选项2,则可以自定义设置以执行操作。
1. 如果您选择选项1,则将使用默认设置来执行操作。 2. 如果您选择选项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(),但无法从反编译器中准确确定流程(讨厌的编译器goto优化)。
而BackgroundWorker.Invoke()似乎使用:
this.asyncOperation.Post(this.progressReporter, args);
这似乎最终会调用ThreadPool.QueueUserWorkItem()。
(我猜测每种情况下这些是相关的函数调用。) 如果我理解正确,使用线程池不会保证执行顺序,而使用Post机制则会。也许这将是一个潜在的区别?(编辑 - 我无法合成这样的情况 - 调用顺序似乎在两种情况下都得到保留,至少在我的简单测试中是如此。)
谢谢!