1

奇妙なバグがあります。理由についての手がかりがあれば教えてください。

メイン フォームにTimer( System.Windows.Forms.Timer) があり、いくつかの更新が発生し、最終的にメイン フォームの UI も更新されます。ShowDialog()次に、メソッドを使用してメイン フォームからエディターを開きます。このエディタにはPropertyGrid( System.Windows.Forms.PropertyGrid) があります。

私は毎回それを再現することはできませんが、エディターでそのプロパティ グリッドでドロップダウンを使用すると、スタックします。つまり、[OK]/[キャンセル] ボタンでフォームが閉じられず、プロパティ グリッドが使用できなくなり、フォームの [閉じる] ボタンが表示されます。ヘッダーが機能しません。

バックグラウンドで例外はありません。プロセスを中断すると、最初に述べた更新に関連する計算をアプリが実行していることがわかります。

何をお勧めしますか?どんなアイデアでも大歓迎です。

4

1 に答える 1

1

何が起こっているかというと、スレッド タイマーの Tick メソッドが別のスレッドで実行されないため、完了するまで他のすべてがロックされます。イベントがこれを行うタイマーと2つのボタンを備えたテストwinformsアプリを作成しました。

private void timer1_Tick(object sender, EventArgs e)
{
    Thread.Sleep(6000);
}

private void button1_Click(object sender, EventArgs e)
{
    timer1.Start();
}

private void button2_Click(object sender, EventArgs e)
{
    frmShow show = new frmShow();
    show.ShowDialog(); // frmShow just has some controls on it to fiddle with
}

実際、あなたが説明したようにブロックされました。以下はそれを解決しました:

private void timer1_Tick(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(DoStuff);
}

private void DoStuff(object something)
{
    Thread.Sleep(6000);
}
于 2009-04-09T17:50:01.223 に答える