在我正在处理的遗留代码中,有几个文件检索步骤 - 首先是这组数据,然后是那组数据,它用一个标签显示进度条,显示进程的哪个部分当前处于活动状态,当然,进度条本身会更新其位置。然而,所有这一部分中的一部分是悬挂的,并且通过使用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)
您可能知道, 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不是空”
根据“500 - 内部服务器错误”的答案,我在前面添加了一行来显示ProgressBar:
ProgressBar.ShowDialog();
if( pbDialog != null ) . . .
......但它没有差异;事实上,有了它,我甚至没有它没有它 - 我没有看到“pbDialog不是空”的消息。
事先向Billy Blake道歉,但是:锤子是什么?什么链?什么铁砧?这里有什么可怕的把握?
显然,这些行中的任何一行都会导致挂起:
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.
问题可能不在这个代码中,因为我发现在同一个类中使用完全相同的代码的另一个位置,并且数据检索的那部分完成得很好......
答案 0 :(得分:2)
您在此处指定要将ProgressBar作为pbDialog的模式所有者:
pbDialog.ShowDialog( ProgressBar, this );
但看起来你实际上还没有显示ProgressBar(所有者)。