gpt4 book ai didi

wpf - 使用 BackgroundWorker 更新 GUI

转载 作者:行者123 更新时间:2023-12-04 16:41:17 24 4
gpt4 key购买 nike

我一直在搜索并发现执行后台工作和更新 GUI 的一个好方法是使用后台工作人员。然而,做这个(愚蠢的)小任务(从 1 到 10000)它不会更新标签内容而是打印到调试! (这当然只是另一个项目的秒杀解决方案......)

这是代码:

public partial class MainWindow : Window
{
BackgroundWorker bw = new BackgroundWorker();

public MainWindow()
{
InitializeComponent();
}

private void button1_Click(object sender, RoutedEventArgs e)
{

bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.WorkerReportsProgress = true;
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();

}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("DONE");

}

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Content = "going here: "+e.ProgressPercentage;
Debug.WriteLine(e.ProgressPercentage);
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i=0; i < 10000; i++)
{
bw.ReportProgress((i*100)/10000);
}
}

}

最佳答案

ProgressChanged事件在 UI 线程上引发,而不是在工作线程上引发。在您的代码中,工作线程几乎什么都不做(只是从 0 到 10000 循环并调用 ReportProgress ),大部分工作是在 UI 线程上完成的。基本上,您发送了太多进度通知。正因为如此,UI 线程几乎总是很忙,没有时间渲染标签的新内容。

当您更改控件的属性时,WPF 中的渲染不会立即执行,而是在单独的调度程序框架上完成,当调度程序没有更紧急的事情要做时,会根据任务的优先级进行处理。用于渲染的优先级值为 7 ( DispatcherPriority.Render ); ProgressChanged事件被编码到 UI 线程,优先级为 9 ( DispatcherPriority.Normal ), as specified on MSDN .所以ProgressChanged通知总是比渲染具有更高的优先级,并且由于它们不断出现,调度程序永远没有时间处理渲染任务。

如果您只是降低通知的频率,您的应用应该可以正常工作(目前您为每个百分比值发送 100 个通知,这是无用的):

    void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10000; i++)
{
if (i % 100 == 0)
bw.ReportProgress(i / 100);
}
}

关于wpf - 使用 BackgroundWorker 更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192169/

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