私が取り組んでいるレガシーコードには、いくつかのファイル取得手順があります。最初にこのデータセット、次にそのデータセットで、プロセスのどの部分が現在アクティブであるかを示すラベルでプログレスバーが更新され、進行状況が表示されます。もちろん、バー自体はその位置を更新します。ただし、このすべての一部がハングしています。sを使用することでMessageBox.Show()
(この方法で実行する必要があり、デバッガーでステップスルーできません)、ハングが発生している場所を絞り込みましたが、できます。なぜそれが起こっているのかを理解する。
警告:次のコードは非正統的であり、「HerebeDragons」や「Thiswayliesmadness」などの警告標識を正当化する可能性があります。自己責任で続行してください/危険に注意してください。
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はnullではなかった」です。
更新2
「500-内部サーバーエラー」の回答に従って、プログレスバーを表示する行を追加しました。
ProgressBar.ShowDialog();
if( pbDialog != null ) . . .
...しかし、それは違いを生みません。実際、それがなければ、私はそれがない限りそれを達成することさえできません-「pbDialogはnullではありませんでした」というメッセージは表示されません。
ビリーブレイクに事前にお詫びしますが、ハンマーは何ですか?何のチェーン?何のアンビル?ここではどのような恐ろしい把握が行われていますか?
更新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
まったく同じコードを使用する同じクラスの別の場所を見つけたので、結局このコードには問題がない可能性があり、データ取得のその部分は問題なく完了します...