Search code examples
c#.netwinformsbackgroundprogress

Show progress only if a background operation is long


I'm developing a C# operation and I would like to show a modal progress dialog, but only when an operation will be long (for example, more than 3 seconds). I execute my operations in a background thread.

The problem is that I don't know in advance whether the operation will be long or short.

Some software as IntelliJ has a timer aproach. If the operation takes more than x time, then show a dialog then.

What do you think that is a good pattern to implement this?

  • Wait the UI thread with a timer, and show dialog there?
  • Must I DoEvents() when I show the dialog?

Solution

  • I will go with the first choice here with some modifications:

    First run the possible long running operation in different thread.
    Then run a different thread to check the first one status by a wait handle with timeout to wait it for finish. if the time out triggers there show the progress bar.

    Something like:

    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.
        } 
    }