2012-02-20 55 views
-1

我遇到了一个问题,我似乎无法找出解决方案,我已经阅读了几个答案,并已知道我需要一个BackgroundWorker线程使这个解决方案有效,但我仍然遇到一些问题。在后台的进度栏工人没有加载

我有一个小尺寸的第二个窗体,并将其设置为屏幕中央,并将ProgressBar样式设置为“选取框”,此第二个窗体上没有其他任何内容,因为它旨在模拟加载栏。

在我的数据的代码的密集部分,主要形式,其中它抓住和从我已经它写成这样一个数据库解析数据上:

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

背景工人在下面定义为这样,也是主要的形式。

private void bwLoading_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     frmLoading lb = new frmLoading(); 
     bool running = true; 
     while (running) 
     { 
      if ((worker.CancellationPending == true)) 
      { 
       lb.Close(); 
       running = false; 
      } 
      else 
      { 
       lb.Show(); 
      } 
     } 

    } 

我所遇到的问题是,用这种方法,显示了包含进度条也显示当数据开始被收集和处理以及数据加载完成后不会消失装载形式,但该窗口是空的,就像它试图加载,但它没有。我似乎无法弄清楚为什么这不起作用。

是不是后台工作人员为加载表单创建单独的线程来使用?还是有我从阅读中错过的其他东西?

+0

为什么CancelAsync?试图消除这一点? – 2012-02-20 23:22:23

+0

并且:不要在DoWork()中创建或显示表单。 – 2012-02-20 23:23:48

+0

@HenkHolterman我不相信你正确理解我的问题。我正在处理时显示一个“繁忙”框。取消是为了让后台工作人员知道何时隐藏“繁忙”框。 – Sorean 2012-02-20 23:48:53

回答

3

您必须使用ReportProgress()实际报告后台操作的进度。这要求你知道你已经完成了多少工作。

如果你没有报告进度,进度条会一直保持在0%,直到你的后台操作完成,然后消失 - 这就是你正在观察的。

编辑:

在您的评论的光 - 您使用的是帐篷式的进度条 - 我认为这个问题是在这里:

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

我怀疑你从UI线程执行GetData()方法 - 这意味着UI线程被阻止,进度条无法更新。将所有处理移动到bwLoading_DoWork方法,以便在单独的线程上执行,而不是在UI线程上执行 - 那么应该更新进度栏。还要删除bwLoading.CancelAsync()调用 - 这将仅用于取消。

+0

但表单设置为选取框样式。这是否仍然需要报告进展? – Sorean 2012-02-20 23:46:35

+0

还是我误解它,我需要一个后台工作负载的第二个窗体? – Sorean 2012-02-21 00:31:58

+0

@JKM:不,你错了,我错过了跑马灯风格 - 你不应该在这种情况下报告进度,所以问题是其他地方。您是否将进度条设置为可见? – BrokenGlass 2012-02-21 01:08:48