【发布时间】:2010-05-19 13:39:03
【问题描述】:
下面选项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() 这样的原生函数,但无法准确计算出反射器的流程(讨厌的编译器 goto 优化)
而 BackgroundWorker.Invoke() 似乎使用:
this.asyncOperation.Post(this.progressReporter, args);
这似乎最终调用了 ThreadPool.QueueUserWorkItem()
(我只是猜测这些是每种情况的相关函数调用。)如果我理解正确,使用 ThreadPool 不能保证执行顺序,而使用 Post 机制可以。也许这将是一个潜在的差异? (编辑 - 我无法综合这种情况 - 在这两种情况下似乎都保留了调用顺序,至少在我的简单测试中是这样。)
谢谢!
【问题讨论】:
标签: winforms multithreading controls backgroundworker invoke