0

我需要使用线程在进度条中显示方法 DoLongWork() 完成的工作的百分比。

Public string  DoLongWork(int varName)
{
      Thread.Sleep(1000000);

       /*This method will take 1 hour to return the result (say)*/
      Return "Done";
 }

DoLongWork() 方法将执行数据库备份。您知道执行数据库备份需要更多时间,我需要在进度条上显示备份的百分比。谢谢

任何类型的建议都将受到高度赞赏。

4

4 回答 4

3

您可以使用BackgroundWorker报告已过去的进度。一个小例子:

/// <summary>
/// Start a new worker
/// </summary>
void StartWork()
{
    var backgroundWorker = new BackgroundWorker();

    //make sure the worker reports on progress
    backgroundWorker.WorkerReportsProgress = true;

    //we want to get notified when progress has changed
    backgroundWorker.ProgressChanged+=backgroundWorker_ProgressChanged;

    //here we do the work
    backgroundWorker.DoWork += backgroundWorker_DoWork;

}

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //do long work
}

ProgressBar _progressBar = new ProgressBar();
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //when we are notified about progress changed, update the progressbar
    _progressBar.Value = e.ProgressPercentage;
}
于 2013-07-11T13:29:57.417 回答
2

对于您想要做的事情,我建议后台工作人员执行该方法并提供检查进度条状态的功能。

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

于 2013-07-11T13:25:35.633 回答
1

您的问题尚不清楚,但我假设您指的是如何管理线程,并且您可能正在使用 WinForms?

如果是这样:

  • 在后台(或非 UI)线程上执行“DoLongWork”函数。有多种方法可以做到这一点,包括使用 ThreadPool 类,或创建一个新的 Thread 对象来引用您的方法并在其上调用 Start()

  • 在 DoLongWork 中完成的工作期间定期(即,可能每次循环一次?),将进度图发布回 UI 线程,以便可以在进度条控件上呈现它。这是必需的,因为控件的更改必须发生在 UI 线程上。查看用于执行此操作的 Control.Invoke 和 Control.BeginInvoke 方法

您可能还想重新考虑您的 DoLongWork 方法是否有返回值。如果它在一个单独的线程上运行,我不确定返回值是否可以去任何地方......正常的方法是将它的结果存储在某个地方,以便它可以通过运行时运行的逻辑来检索工作完成了。假设完成后 UI 中发生了某些事情,这可能是一个单独的方法,通过 DoLongWork 在 UI 线程上调用另一个 Invoke/BeginInvoke 调用作为其最后一步。

于 2013-07-11T13:41:58.337 回答
0

你应该考虑使用后台工作者来更新你的进度条

这是一个带有进度条的后台工作者示例

于 2013-07-11T13:28:29.400 回答