为什么方法在没有中断的情况下返回true而在break时返回false C#

时间:2016-04-14 15:13:00

标签: c# winforms visual-studio process

我在这里有一点益智。

背景:我有一个应用程序可以记录用户选择要显示的文件后查看过的文件。

但是,我们也选择了一个WinForm文件,这些文件在他们正在查看的文件中关闭之前一直保持隐藏状态。

以下是相关代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace ViewTracker
{
    public partial class NewFile : Form
    {
        //checks to see if a file is open       
        public NewFile()
        {
            InitializeComponent();
            //
            OpenDocuments();
            //starts the timer component
            tm_CountDown.Start();


            while (CheckFileIsOpen() == false)
            {
                this.Hide();
            }
            this.Show();
        }

        //timer to count down
        //executes every 1 second, interval of the timer component
        private void tm_CountDown_Tick(object sender, EventArgs e)
        {
        }
        #endregion

        #region METHODS AND EVENTS

        //opens documents based on file selection
        private void OpenDocuments()
        {
        }

        //SHUT DOWN EVERYTHING (files at least)
        private void CloseEverything()
        {
        }

        //checks to see if a file is open and when the file closes shows the new file select dialog
        private bool CheckFileIsOpen()
        {
            Process[] pr_excel = Process.GetProcessesByName("EXCEL");
            Process[] pr_word = Process.GetProcessesByName("WINWORD");
            Process[] pr_pdf = Process.GetProcessesByName("ACROBAT");
            if (pr_excel.Count() != 0)
            {
                while (pr_excel[0].HasExited == false)
                {
                    return false;
                }
            }

            else if (pr_word.Count() != 0)
            {
                while (pr_word[0].HasExited == false)
                {
                    return false;
                }
            }

            else if (pr_pdf.Count() != 0)
            {
                while (pr_pdf[0].HasExited == false) ;
                {
                    return false;
                }
            }

            else if (prisonImages.Visible == true)
            {
                while (prisonImages.Visible == true)
                {
                    return false;
                }
            }

            return true;
        }
    }
}

问题出现在while (CheckFileIsOpen() == false)。如果我在Visual Studio中放置一个中断然后单步执行,程序将按预期运行(表单保持隐藏状态,直到进程消失)。但是,如果我在没有中断的情况下运行,则看起来好像进程从未运行。

我在Thread.Sleep(1000)语句之前尝试了while (CheckFileIsOpen() == false),看看是否可能只是停止线程几秒钟就可以让它有机会让进程打开,但整个应用程序只是无限期冻结

问题: 我的应用程序是否只是反应太快而无法在打开之前捕获进程并触发?如果是这样,我可以使用哪些选项来避免直接跳到假设没有进程打开?

感谢您的时间。

修改

我在发布此内容后几分钟找到了解决方案。 我改变了一些执行步骤,最后使用Process.WaitForExit()方法来满足我的要求。

如果有人想知道,CheckFileIsOpen()现在的工作方式如下:

 private void CheckFileIsOpen()
    {
        Process[] pr_excel = Process.GetProcessesByName("EXCEL");
        Process[] pr_word = Process.GetProcessesByName("WINWORD");
        Process[] pr_pdf = Process.GetProcessesByName("ACROBAT");
        if (pr_excel.Count() != 0)
        {
            pr_excel[0].WaitForExit();
        }

        else if (pr_word.Count() != 0)
        {
            pr_word[0].WaitForExit();
        }

        else if (pr_pdf.Count() != 0)
        {
            pr_pdf[0].WaitForExit();
        }
      }

1 个答案:

答案 0 :(得分:0)

使用while循环方法阻止gui thead和你的应用程序冻结。

在构造函数中调用this.Hide()并使用另一个计时器。在计时器tick事件中,如果这返回false CheckFileIsOpen()并停止计时器,则调用方法this.Show()