为什么进度条形码导致进度条“挂起”?

时间:2013-03-15 16:59:18

标签: c# progress-bar windows-ce remote-debugging hang

在我正在处理的遗留代码中,有几个文件检索步骤 - 首先是这组数据,然后是那组数据,它用一个标签显示进度条,显示进程的哪个部分当前处于活动状态,当然,进度条本身会更新其位置。然而,所有这一部分中的一部分是悬挂的,并且通过使用MessageBox.Show()(我必须这样做,不能在调试器中逐步执行它),我已经缩小了悬挂的位置发生了,但无法弄清楚为什么正在发生。

警告:以下代码是非正统的,并且很可能保证这样的警告标志为“Here be Dragons”或“This way lies madness”。继续冒险/小心危险。

    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的声明格式与此代码段相同:

public pbDialogs pbDialog;

pbDialogs是另一种形式的类(frmProgress.cs):

public class pbDialogs : IDisposable 

ProgressBar是frmProgress.cs中定义的匿名类的一个实例(frmProgress,也就是说,派生自System.Windows.Forms.Form)

public  static  frmProgress ProgressBar;

typeProgress是本地定义的int:

public static int typeProgress = 0;

evt是传递到此代码段所源自的方法的arg的名称:

private void FetchVendorDepartmentData(ManualResetEvent evt)
您可能知道,

ManualResetEventSystem.Threading

的成员

有没有人在这里看到任何令人惊讶的眉毛(除了一般的非正统之外)?

更新

我添加了更多消息:

    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
}

...我看到的最后一个是“pbDialog不是空”

更新2

根据“500 - 内部服务器错误”的答案,我在前面添加了一行来显示ProgressBar:

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

......但它没有差异;事实上,有了它,我甚至没有它没有它 - 我没有看到“pbDialog不是空”的消息。

事先向Billy Blake道歉,但是:锤子是什么?什么链?什么铁砧?这里有什么可怕的把握?

更新3

显然,这些行中的任何一行都会导致挂起:

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.

更新4

问题可能不在这个代码中,因为我发现在同一个类中使用完全相同的代码的另一个位置,并且数据检索的那部分完成得很好......

1 个答案:

答案 0 :(得分:2)

您在此处指定要将ProgressBar作为pbDialog的模式所有者:

pbDialog.ShowDialog( ProgressBar, this );

但看起来你实际上还没有显示ProgressBar(所有者)。