0

在下面的代码中,我有一个观察者,它查看文件是否已更改,如果文件已更改,我会在表单上显示更改的信息,但如果我为此使用 form.Show() 它会冻结但 form.showDialog() 工作正常,这两者有什么区别以及如何确定使用哪一个

    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 回答