gpt4 book ai didi

c# - BackgroundWorker 循环中的方法更新进度条

转载 作者:行者123 更新时间:2023-11-30 18:46:38 24 4
gpt4 key购买 nike

首先这是我的代码布局:

public partial class GUI : Form
{
public GUI()
{
InitializeComponent();
}

private void GoButton_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BigMethod bigMeth = new BigMethod();
bigMeth.begin();
}

public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
progressBar.Refresh();
}

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done");
}
}

public class BigMethod()
// If it matters, BigMethod() is in a separate .cs file in the same namespace
{
public void begin()
{
for (; time <= 3600; time += T_STEP) // Running for 1 hour
{

//**********************************************
// DO FOR EACH TIMESTEP
//**********************************************

// Stuff

//**********************************************
// Report back
//**********************************************
gui.backgroundWorker1.ReportProgress((int)(time / RUNTIME * 100));
//gui.progressBar.Value = (int)(time / RUNTIME * 100);

Thread.Sleep(100);
timeCounter += T_STEP;

} // End Loop
}
}

所以我在一个单独的类中有一个名为 BigMethod() 的方法,它包含一个非常大的数学密集型循环,大约需要 15 秒才能完成。现在我有一个异步运行包含巨大 BigMethod() 的 BackgroundWorker 的按钮。据我所知,这种方法工作得很好,该方法完全按照预期的方式进行,而不会“崩溃”GUI。

问题是,progressBar 没有刷新。 (每次 BigMethod() 内的循环完成时,它都会重新计算进度并向 backgroundWorker 报告)。属性 progressBar.Value 更新良好,Debug.WriteLine(progressBar.Value) 准确显示它应该显示的内容,0-100 平滑增加,但实际 progressBar 不会移动,也不会在完成后跳到 100。

如果我剪切 BigMethod 并将其放在 _DoWork 中,一切都可以正常工作,但这不是一个选项,因为它严重破坏了代码布局。

我该怎么做才能解决这个问题?我已经尝试过 progressBar.Refresh() 和 progressBar.Update() 但它们什么也没做。

您可能会说,我是线程处理的新手,所以这里可能缺少一些明显的东西,但我就是看不到它。你如何从类之外的某个地方更新 progressBar?

最佳答案

backgroundWorker 与 GUI 线程在不同的线程上。您必须通过查看 InvokeRequired ( http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx ) 来检查您是否在 GUI 线程上。如果不是,请通过调用 Invoke() ( http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx ) 在 GUI 线程上调用函数。

这段代码应该可以解决问题。

public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<object, ProgressChangedEventArgs>(backgroundWork1_ProgressChanged), sender, e);
return;
}
this.progressBar.Value = e.ProgressPercentage;
}

关于c# - BackgroundWorker 循环中的方法更新进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024088/

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