我在这里有一点益智。
背景:我有一个应用程序可以记录用户选择要显示的文件后查看过的文件。
但是,我们也选择了一个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();
}
}
答案 0 :(得分:0)
使用while循环方法阻止gui thead和你的应用程序冻结。
在构造函数中调用this.Hide()
并使用另一个计时器。在计时器tick事件中,如果这返回false CheckFileIsOpen()
并停止计时器,则调用方法this.Show()
。