0

次のコードでは、ファイルが変更されたかどうかを確認するウォッチャーがあり、変更された場合はフォームに変更された情報を表示しますが、form.Show()を使用するとフリーズしますが、form.showDialog()は正常に機能します、これら2つの違いと、どちらを使用するかを決定する方法

    private void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        _watcher.EnableRaisingEvents = false;
        try
        {
            if (_displayPatientInfo != null)
            {
                _displayPatientInfo.Dispose();
            }
            GetPatientInfo(e.FullPath);
            using (StreamReader sr = new StreamReader(e.FullPath, Encoding.Default))
            {
                String line;
                line = sr.ReadToEnd();

                if (line.IndexOf("<IsPatientFixed>") > 0)
                {
                    var value = GetTagValue(line, "<IsPatientFixed>", "</IsPatientFixed>");
                    if (value == "true" || value == "True")
                    {

                        _displayPatientInfo = new frmPatientInfoDisplay();
                        _displayPatientInfo.SetData(_patientInfo);
                        _displayPatientInfo.ShowDialog();

                    }
                }
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            _watcher.EnableRaisingEvents = true;
        }
    }
4

2 に答える 2

4

@Habib が ShowDialog() を呼び出すときに言ったように、この後のコードは、フォームを閉じてウォッチャーが動かなくなるまで実行されません。

あなたの問題は、ウォッチャーがメイン フォームとは別のスレッドで実行されていることです。そのため、Show() を呼び出すと、メイン スレッドが所有するメモリの一部にアクセスしようとするため、アプリケーションがフリーズします。これを修正するには、_displayPatientInfo フォームを表示または破棄するときに Invoke(Delegate) を使用できます。

Control.Invoke メソッド (デリゲート)

    Executes the specified delegate on the thread that owns the control's underlying window handle.
于 2012-09-15T05:43:38.527 に答える
2

ShowDialogフォームを閉じるまでプログラム フローを停止しShowますが、フォームを表示してプログラム フローを続行します。

Form.ShowDialog - MSDN

このメソッドを使用して、アプリケーションでモーダル ダイアログ ボックスを表示できます。このメソッドが呼び出されると、その後のコードは、ダイアログ ボックスが閉じられるまで実行されません。

問題はusing ブロックが原因です。ShowDialog メソッドは、フォームが閉じられるまでプログラム フローをブロックしています。これは、using ブロックが終了しないためです。Show一方、制御はすぐに次の行に戻ります。フォーム オブジェクトは using ブロック内で作成したため、ブロックの外では表示されません。そのため、フォームが動かなくなります。

于 2012-09-14T04:38:34.423 に答える