0

私が取り組んでいるレガシーコードには、いくつかのファイル取得手順があります。最初にこのデータセット、次にそのデータセットで、プロセスのどの部分が現在アクティブであるかを示すラベルでプログレスバーが更新され、進行状況が表示されます。もちろん、バー自体はその位置を更新します。ただし、このすべての一部がハングしています。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 

ProgressBarfrmProgress.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

まったく同じコードを使用する同じクラスの別の場所を見つけたので、結局このコードには問題がない可能性があり、データ取得のその部分は問題なく完了します...

4

1 に答える 1

2

ここでは、pbDialogのモーダル所有者としてProgressBarが必要であることを指定しています。

pbDialog.ShowDialog( ProgressBar, this );

ただし、この時点ではまだ実際にProgressBar(所有者)を表示しているようには見えません。

于 2013-03-15T17:08:03.250 に答える