我的目标是强制进程运行至少 5 秒(实际上是任何时间)。我正在使用带有 Service Pack 1 的 .NET Framework 3.5。这个想法是文档包含一些用户必须看到的信息,因此为了防止他们立即单击关闭文档,我们可以强制它保持打开状态一段时间。我开发了一个小型测试 UI,由一个按钮和三个单选按钮(每个文档一个)组成。这是我背后的代码...
我定义了文件路径的字符串,所选文件路径的字符串,以及存储进程 ID 的 int,如果它们可以退出程序的布尔值,以及线程和计时器声明,例如..
string WordDocPath = @"Some file path\TestDoc_1.docx";
string PowerPointPath = @"Some file path\Test PowerPoint.pptx";
string TextFilePath = @"Some file path\TestText.txt";
string processPath;
int processID;
bool canExit = false;
System.Threading.Thread processThread;
System.Timers.Timer processTimer;
在构造函数中,我初始化线程和计时器,将线程的启动方法设置为一个名为 TimerKeeper() 的方法,然后启动线程。
processTimer = new System.Timers.Timer();
processThread = new System.Threading.Thread(new System.Threading.ThreadStart(timeKeeper));
processThread.Start();
我将计时器设置为 5 秒,然后它将 canExit 布尔值设置为 true。
public void timeKeeper()
{
processTimer.Elapsed += new System.Timers.ElapsedEventHandler(processTimer_Elapsed);
processTimer.AutoReset = false;
processTimer.Interval = 5000; //5000 milliseconds = 5 seconds
}
void processTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
canExit = true;
}
剩下的是我的按钮的点击事件,它决定了使用哪个文件路径来启动进程,启动计时器,然后启动进程本身。
private void button1_Click(object sender, RoutedEventArgs e)
{
if ((bool)PowerPointRadioButton.IsChecked)
{
processPath = PowerPointPath;
}
if ((bool)WordDocRadioButton.IsChecked)
{
processPath = WordDocPath;
}
if ((bool)TextDocRadioButton.IsChecked)
{
processPath = TextFilePath;
}
try
{
canExit = false;
processTimer.Start();
while (!canExit)
{
processID = System.Diagnostics.Process.Start(processPath).Id;
System.Diagnostics.Process.GetProcessById(processID).WaitForExit();
if (!canExit)
{
processTimer.Stop();
MessageBox.Show("Document must remain open for at least 5 seconds.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
processTimer.Start();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error dealing with the process.\n" + ex.Message.ToString());
}
在大多数情况下,这实际上是有效的。用户仍然可以关闭文档,但如果还没有过 5 秒,它将重新打开。除了 word 文档 (.docx)。powerpoint 和 text 文件进展顺利,但 word 文档有一些奇怪的行为(请注意,所有 3 个文件都在同一个文件目录中)。当我选择 word 文档单选按钮并单击该按钮时,word 文档将打开,但我也收到来自 catch 块的消息框的提示,提醒我“对象引用未设置为对象上的实例”异常是抛出。这只发生在 word 文档中。就像我说的,word 文档仍然打开(我可以看到它的内容,就像 powerpoint 或文本文件一样)。异常会导致检查是否可以退出的行被跳过,
谁能在这里看到我的问题?或者是否有更好的方法来完成所有这些(我是 wpf/c# 新手)?我只是不明白为什么这只发生在 word 文档中,而不是 powerpoint 和文本文件。