2013-07-11 385 views
0

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

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

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

DoLongWork()方法会做database.You的备份知道这将需要更多的时间来进行数据库备份,我需要显示在progressbar.Thanks

任何采取备份的百分比建议类型将高度赞赏。

+0

如果你真的在这个线程中执行Thread.Sleep(1000000),我不认为有什么办法让进度条知道它已经睡了多久,就像这样。但是如果你在这个线程中实际上有一些循环,你需要使用'delegate'来更新你的进度条,如果它在UI线程中的话。 – James

+0

此问题已在那里:http://stackoverflow.com/questions/11623923/progress-bar-and-backgroundworker-in-c-sharp –

+0

@ judgeja:DoLongWork()方法将做一个数据库的备份。你知道哪些将需要更多的时间来执行数据库备份,我需要显示进度条上采取的备份的百分比。感谢 – aks

回答

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; 
} 
2

对于你想做的事情,我会建议一个后台工作人员来做这个方法,并给出功能来检查进度条的状态。

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

+0

DoLongWork()方法将做数据库的备份。您知道哪些操作需要更多时间来执行数据库备份,而且我需要显示进度条上备份的百分比。感谢 – aks

1

这不是从你的问题不清楚,但我相信你是指如何管理线程,你可能正在使用的WinForms?

如果是这样的:

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

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

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

+0

是的,我正在使用Winform并想知道如何管理线程。 DoLongWork方法没有循环,它会在1小时后返回值(说) – aks

+0

有没有什么方法可以测量进度呢?如果它只是一个非常长的IO调用,则可能需要估计持续时间,并且如果任务结束,则需要一个用于减慢持续时间的算法。如果你这样做,你可以使用System.Timers.Timer对象定期触发你的进度条更新,在它的Elapsed事件中。如上所述,您仍然可以在非ui线程上执行您的工作方法,并在ui线程完成时调用某些方法。 – tonks