0

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

警告:下面的代码是非正统的,很可能需要像“这里是龙”或“这条路是疯狂的”这样的警告标志。继续自担风险/谨防危险。

    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)

ManualResetEvent,如您所知,是System.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 不为空”的消息。

提前向比利布莱克道歉,但是:什么锤子?什么链子?什么铁砧?这里发生了什么可怕的事情?

更新 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

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

4

1 回答 1

2

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

pbDialog.ShowDialog( ProgressBar, this );

但此时您似乎还没有实际显示 ProgressBar (所有者)。

于 2013-03-15T17:08:03.250 回答