gpt4 book ai didi

winforms - BackgroundWorker.ReportProgress() 和 Control.BeginInvoke() 之间的区别

转载 作者:行者123 更新时间:2023-12-01 13:06:24 31 4
gpt4 key购买 nike

下面选项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 机制可以。也许那将是一个潜在的差异? (编辑 - 我无法综合这种情况 - 在这两种情况下似乎都保留了调用顺序,至少在我的简单测试中是这样。)

谢谢!

最佳答案

两者是一样的。您在 BackgroundWorker 中看到的调用使用 SynchronizationContext。事实上,Post() 方法的默认实现使用线程池,但是当启动 Windows 窗体应用程序时,默认的同步上下文被替换为 WindowsFormsSynchronizationContext,它实际上调用 Control.BeginInvoke()

关于winforms - BackgroundWorker.ReportProgress() 和 Control.BeginInvoke() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2865971/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com