在我正在处理的遗留代码中,有几个文件检索步骤 - 首先是这组数据,然后是那组数据,它们更新一个带有标签的进度条,显示进程的哪个部分当前处于活动状态,以及进度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
毕竟问题可能不在这段代码中,因为我在同一个类中发现了另一个使用完全相同代码的位置,并且数据检索的那部分完成得很好......