Search code examples
c#progress-barwindows-ceremote-debuggingfreeze

Why would this progress bar code cause the progress bar to "hang"?


In the legacy code I'm working on, there are several file retrieval steps - first this set of data, then that set of data, which update a progress bar with a label displaying which portion of the process is currently active, and the progress bar itself, of course, updates its position. One portion of all this is hanging, though, and via the use of MessageBox.Show()s (I have to do it this way, can't step through it in the debugger), I've narrowed down where the hanging is occurring, but can't figure out why it's occurring.

Warning: the following code is unorthodox and may well warrant such warning signage as "Here be Dragons" or "This way lies madness." Proceed at your own risk/beware of the peril.

    MessageBox.Show("Made it just before the pbDialog code");//<-- it hangs after this is displayed
    using (pbDialog = new pbDialogs())
    {
        ProgressBar = new frmProgress( this, true);
        ProgressBar.SetProgressLabelText("Vendor/Dept/Expense Data");
        typeProgress = (int)ProgressStates.ProgressQRY;

        ProgressBar.label1.Text += " (Receiving)";
        if( pbDialog != null )
        {
            pbDialog.ShowDialog( ProgressBar, this );
        }
        else
        {
            ProgressBar.ShowDialog();
        }
        ProgressBar = null;
        evt.Set();  
    }
    MessageBox.Show("Made it just after the pbDialog code"); //This is not seen

pbDialog is declared in the same form as this code snippet:

public pbDialogs pbDialog;

pbDialogs is a class in another form (frmProgress.cs):

public class pbDialogs : IDisposable 

ProgressBar is an instance of the anonymous class defined in frmProgress.cs (frmProgress, that is to say, which derives from System.Windows.Forms.Form)

public  static  frmProgress ProgressBar;

typeProgress is a locally defined int:

public static int typeProgress = 0;

evt is the name of the arg passed into the method from which this snippet originates:

private void FetchVendorDepartmentData(ManualResetEvent evt)

ManualResetEvent, as you may know, is a member of System.Threading

Does anybody see anything eyebrow-raising here (besides the general unorthodoxy of it all)?

UPDATE

I added more messages:

    MessageBox.Show("Made it just before the pbDialog code");//<-- it hangs after this. TODO: Remove before deploying
    using (pbDialog = new pbDialogs())
    {
        MessageBox.Show("Made it just before ProgressBar = new frmProgress");// TODO: Remove
        ProgressBar = new frmProgress( this, true);
        MessageBox.Show("Made it just after ProgressBar = new frmProgress");// TODO: Remove
        ProgressBar.SetProgressLabelText("Vendor/Dept/Expense Data");
        typeProgress = (int)ProgressStates.ProgressQRY;
        MessageBox.Show("Made it just after assignment to typeProgress");// TODO: Remove
        ProgressBar.label1.Text += " (Receiving)";
        if( pbDialog != null )
        {
            MessageBox.Show("pbDialog was not null");// TODO: Remove
            pbDialog.ShowDialog( ProgressBar, this );
        }
        else
        {
            MessageBox.Show("pbDialog was null");// TODO: Remove
            ProgressBar.ShowDialog();
        }
        ProgressBar = null;
        MessageBox.Show("ProgressBar set to null");// TODO: Remove
        evt.Set();  
        MessageBox.Show("evt.Set called");// TODO: Remove
    }
    MessageBox.Show("Made it just after the pbDialog code");//TODO: Remove
}

...and the last one I see is, "pbDialog was not null"

UPDATE 2

In accord with the answer from "500 - Internal Server Error," I prepended a line to show the ProgressBar:

ProgressBar.ShowDialog(); 
if( pbDialog != null ) . . .

...but it makes no diff; in fact, with that I don't even make it as far as without it - I don't see the "pbDialog was not null" message.

Apologies in advance to Billy Blake, but: What the hammer? What the chain? What the anvil? What dread grasp is going on here?

UPDATE 3

So apparently either of these lines cause the hang:

ProgressBar.ShowDialog(); // with this, "pbDialog was not null" is not seen

pbDialog.ShowDialog( ProgressBar, this ); // if make it to here (line above commented out), "ProgressBar set to null" is not seen.

UPDATE 4

The problem may not be in this code after all, as I found another spot in the same class that uses the exact same code, and that portion of the data retrieval completes just fine...


Solution

  • You are specifying that you want ProgressBar as the modal owner of pbDialog here:

    pbDialog.ShowDialog( ProgressBar, this );
    

    but it doesn't look like you've actually shown ProgressBar (the owner) yet at this point.