仅在后台操作很长时才显示进度

Dan*_*lba 6 .net c# background progress winforms

我正在开发一个C#操作,我想显示一个模态进度对话框,但只有当一个操作很长时(例如,超过3秒).我在后台线程中执行我的操作.

问题是我事先并不知道该操作是长还是短.

一些像IntelliJ的软件有一个计时器方法.如果操作时间超过x时间,则显示一个对话框.

你认为这是一个很好的模式来实现这个?

  • 用计时器等待UI线程,并在那里显示对话框?
  • DoEvents()当我显示对话框时,我必须吗?

JP *_*son 5

这是我要做的:

1)使用BackgroundWorker。

2)在调用方法RunWorkerAsync之前,将当前时间存储在变量中。

3)在DoWork事件中,您需要调用ReportProgress。在ProgressChanged事件中,检查时间是否已超过三秒。如果是这样,请显示对话框。

这是BackgroundWorker的MSDN示例:http : //msdn.microsoft.com/zh-cn/library/cc221403(v=vs.95).aspx

注意:一般来说,我同意Ramhound的评论。只是总是显示进度。但是,如果您不使用BackgroundWorker,我将开始使用它。这会让您的生活更轻松。


Jal*_*aid 4

我将选择这里的第一个选择并进行一些修改:

首先在不同的线程中运行可能长时间运行的操作。
然后运行另一个线程,通过等待句柄检查第一个状态,并超时等待其完成。如果超时触发,则会显示进度条。

就像是:

private ManualResetEvent _finishLoadingNotifier = new ManualResetEvent(false);

private const int ShowProgressTimeOut = 1000 * 3;//3 seconds


private void YourLongOperation()
{
    ....

    _finishLoadingNotifier.Set();//after finish your work
}

private void StartProgressIfNeededThread()
{
    int result = WaitHandle.WaitAny(new WaitHandle[] { _finishLoadingNotifier }, ShowProgressTimeOut);

    if (result > 1)
    {
        //show the progress bar.
    } 
}
Run Code Online (Sandbox Code Playgroud)