gpt4 book ai didi

c# - 进度条从不显示

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:46 24 4
gpt4 key购买 nike

我只是想要一个不确定的进度条,它变得可见并显示一些“事件”以指示查询正在运行,然后,当查询完成时,又回到不可见状态。看起来很简单;但使用此代码:

try
{
Cursor.Current = Cursors.WaitCursor;
progressBarChanges.Value = 50;
progressBarChanges.Step = 20;
progressBarChanges.Visible = true;
... // the meat of the code, where the query is being done, elided
} finally
{
progressBarChanges.Visible = false;
Cursor.Current = Cursors.Default;
}

...进度条从不显示,即使查询需要一段时间才能运行。进度条在 DGV 上。我意识到我的进度代码有点蹩脚,但首先要做的是 - 我只想让这该死的东西为初学者展示一些东西

更新

在调用运行查询的 BackgroundWorker 过程之前,我将进度条设置为可见方式:

progressBarChanges.Value = 50;
progressBarChanges.Step = 20;
progressBarChanges.Visible = true;
. . .
if (args.KeyCode == Keys.Enter)
{
if (ValidEntryForCRID(textBoxID.Text))
{
RetrieveAndBindPlatypusData();
var tb = (TextBox)Controls.Find("textBoxDuckbill", true).First();
if (tb != null)
{
tb.Focus();
}
if ((!string.IsNullOrWhiteSpace(textBoxID.Text)) &&
(backgroundWorkerShowChanges.IsBusy != true))
{
backgroundWorkerShowChanges.RunWorkerAsync();
}
. . .

...然而 progressBar 永远不会变得可见(除非在为 DGV 的数据源分配返回的查询/结果集的 OracleDateTable 值后我从未将它设置回 visible = false)。如果我将其注释掉,它就会(迟来的)最终出现,显然(错误地)认为“迟到总比不到好。”

有没有办法强制 Windows“注意”“progressBarChanges.Visible = true;”马上排队?类似于 .ProcessMessages() 或 this.Refresh 或...???

最佳答案

发生这种情况是因为您没有给 UI 线程更新时间。您正在更新为可见并立即运行您的代码。该代码应在后台线程上运行并发送更新消息。

详细说明:

当您设置 Visible 属性时,直到当前逻辑结束时,UI 线程才真正更新。所以,发生的事情是这样的:

  • 可见
  • 运行流程
  • 不可见
  • 代码已完成,因此 UI 已解冻并更新...最后状态为不可见

你想要的是:

  • 可见
  • 开启新线程跑肉
  • UI 代码已完成,因此 UI 已解冻并将栏更新为可见

然后这个:

  • ==>新线程运行肉发送更新到 UI 线程,以便进度条可以更新

然后这个:

  • 新线程结束并在其 final方法中设置不可见
  • UI 代码已完成,因此 UI 已解冻并将栏更新为不可见

A TaskBackgroundworker应该很容易实现这一点。

更新显示持续滚动的代码

我相信您只是想念进度条的样式应该是 ProgressBarStyle.Marquee。如果您已经将工作卸载给后台工作人员,那么剩下的工作就可以了

    public Form1()
{
InitializeComponent();
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
progressBar1.Enabled = progressBar1.Visible = false;
progressBar1.Style = ProgressBarStyle.Marquee;
}

private void button1_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
progressBar1.Enabled = true;
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread.Sleep(10000);
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = progressBar1.Enabled = false;
}

关于c# - 进度条从不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865342/

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