尝试数字2.尽量做到尽可能清楚,因为我的工作时间比我应该的时间长得多,并且进展甚微。
我需要为应用程序创建一个进度条。现在,一切都在一个UI线程,所有处理和诸如此类的事情中发生,所以当我点击一个按钮后执行长时间运行的过程时,程序会挂起大约40秒,然后继续输出(我无法更改部分,申请是给我的)。而且我还必须创建一个取消按钮,所以如果它在中间过程中被击中,那么在该过程完成后,它会检查取消标志,如果它是ON,则取消所有方法并返回初始位置
我要做的是为此过程制作进度条。其中两个,一个用于中间过程,一个用于总计。中级是一个小动作,如DB调用,输出中间过程(for和foreach循环)。
我已经尝试将条形图放在同一个UI窗口中并在我继续的同一个线程中更新它们(找到主要点,在那里启动进度条并根据我的判断递增它们。并且循环)。这只是加载UI甚至更多,但它正在工作(波动的进度条运动)。
然后我尝试使用后台工作程序。同样的事情,将条形图放在UI中并通过后台工作程序运行它们。即使BG工作程序运行,问题仍然存在,刷新必须在UI窗口中进行,该窗口正忙于处理贪婪请求,所以当我想要它时它不会更新。
我尝试在核心使用多线程(没有BG工作者)并在新线程中创建一个反映进度的新表单,但我被警告不要这样做(同时运行2个UI线程)和我有麻烦传递价值观。更不用说如果使用线程方法,就不可能在没有完全重载CPU的情况下准确表示正在发生的进度(让另一个线程在一段时间内运行(true)并在从某个点调用updateMethod时进行更新处理)
我还有其他选择吗?因为最不消极的方面是我随着程序一起更新进度条的第一个。
答案 0 :(得分:3)
我还有其他选择吗? 是的,不是。最好的选择仍然是花时间学习如何正确使用背景工作,这是迄今为止解决此问题最简单的解决方案。
继续学习这些链接:
最重要的是设置此属性:
bw.WorkerReportsProgress = true;
在DoWork-Function中,请确保向UI报告进度,如链接示例中所示:
worker.ReportProgress((i * 10));
另外,不要忘记在UI中处理progresschanged事件:
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
}
来吧,你会看到:它很简单。
答案 1 :(得分:2)
使用后台工作程序时,您应该在后台工作程序中执行所有非UI处理;你不应该在UI线程中进行处理时使用它来更新UI。
通过将工作移动到BGW的DoWork
处理程序,您可以释放UI线程以允许它处理UI事件,包括更新进度条。
答案 2 :(得分:-2)
private void btnCreate_Click(object sender, EventArgs e)
{
Progressbar1.Minimum = 1;
Progressbar1.Maximum = dt.Rows.Count;
Progressbar1.Value = 1;
Progressbar1.Step = 1;
for (int i = 1; i <= dt.Rows.Count; i++)
{
bool result=InsertUserdetails(Username);
if(result== true)
{
Progressbar1.PerformStep();
}
}
}