C# 在进度条上显示已完成工作的百分比

C# 在进度条上显示已完成工作的百分比,c#,winforms,c#-4.0,C#,Winforms,C# 4.0,我需要使用线程在进度栏中显示方法DoLongWork()完成的工作量的百分比 Public string DoLongWork(int varName) { Thread.Sleep(1000000); /*This method will take 1 hour to return the result (say)*/ Return "Done"; } DoLongWork()方法将备份数据库。您知道执行数据库备份需要更多时间,我需要显示progr

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

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

       /*This method will take 1 hour to return the result (say)*/
      Return "Done";
 }
DoLongWork()方法将备份数据库。您知道执行数据库备份需要更多时间,我需要显示progressbar上备份的百分比。谢谢


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

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


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


< P>你应该考虑使用后台工作人员更新进度条


这里有一个例子

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

下面是一个示例

您可以使用报告已完成进度的。一个小例子:

/// <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;
}
//
///开始新的工作
/// 
void StartWork()
{
var backgroundWorker=新的backgroundWorker();
//确保工人报告进度
backgroundWorker.WorkerReportsProgress=true;
//我们希望在进度发生变化时得到通知
backgroundWorker.ProgressChanged+=backgroundWorker\u ProgressChanged;
//我们开始工作了
backgroundWorker.DoWork+=backgroundWorker\u DoWork;
}
无效backgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
//长工
}
ProgressBar_ProgressBar=新的ProgressBar();
void backgroundWorker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
//当我们收到进度更改的通知时,更新进度栏
_progressBar.Value=e.ProgressPercentage;
}
您可以使用报告已完成进度的。一个小例子:

/// <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;
}
//
///开始新的工作
/// 
void StartWork()
{
var backgroundWorker=新的backgroundWorker();
//确保工人报告进度
backgroundWorker.WorkerReportsProgress=true;
//我们希望在进度发生变化时得到通知
backgroundWorker.ProgressChanged+=backgroundWorker\u ProgressChanged;
//我们开始工作了
backgroundWorker.DoWork+=backgroundWorker\u DoWork;
}
无效backgroundWorker_DoWork(对象发送方,DoWorkEventArgs e)
{
//长工
}
ProgressBar_ProgressBar=新的ProgressBar();
void backgroundWorker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
//当我们收到进度更改的通知时,更新进度栏
_progressBar.Value=e.ProgressPercentage;
}

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

如果是:

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

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

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

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

如果是:

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

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

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

如果您实际上正在执行线程。Sleep(1000000)在这个线程中,我不认为有任何方法可以让进度条知道它已经像这样休眠了多久。但是如果你在这个线程中确实有一些循环,你需要使用一个
委托
来更新你的进度条,如果它在UI线程中。这个问题已经存在了:@judgeja:DoLongWork()方法将备份数据库。您知道执行数据库备份会花费更多的时间,我需要显示progressbar上备份的百分比。谢谢如果您实际正在执行一个线程。在这个线程中睡眠(1000000)我认为没有任何方法可以让progressbar知道它已经运行了多长时间