在 C# WPF 中运行进程至少 5 秒钟
本文关键字:秒钟 进程 运行 WPF | 更新日期: 2023-09-27 18:33:36
我的目标是强制进程运行至少 5 秒(实际上是任意时间(。 我正在使用 .NET Framework 3.5,带有 Service Pack 1。 这个想法是文档包含用户必须看到的一些信息,因此为了防止他们立即单击以关闭文档,我们可以强制它保持打开状态一段时间。 我开发了一个小型测试 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和文本文件进展顺利,但word文档有一些奇怪的行为(请注意,所有3个文件都在同一个文件目录中(。 当我选择 word 文档单选按钮并单击该按钮时,Word 文档将打开,但我也会收到来自 catch 块的消息框提示,提醒我抛出"对象引用未设置为对象上的实例"异常。 这仅发生在 Word 文档中。 就像我说的,word文档仍然打开(我可以看到它的内容,就像PowerPoint或文本文件一样(。 该异常会导致检查是否可以退出的行被跳过,因此文档可以立即关闭,这是一个问题。
任何人都可以在这里看到我的问题吗? 或者如果有更好的方法来完成所有这些操作(我是 wpf/c# 新手(? 我只是不明白为什么这只发生在word文档中,而不是PowerPoint和文本文件。
如果在用户的桌面上运行,则受安装的正确应用程序(例如 Word(及其配置方式的约束。如果这些文件是共享上的只读文件,那么我可以将它们转换为XPS,以便您可以在DocumentViewer中显示它们。而不是强迫他们等待 5 秒钟单击,让他们对他们已经阅读并理解文档的对话框说"是"。 或者像MilkyWayJoe建议的那样,在带有"我同意"按钮的页面上显示此内容。
问题可能是关联的应用程序不是单词应用程序本身,而是代表您启动单词的某个中间应用程序。
要找出答案,请保留对进程对象的引用,并检查它是否已终止,它的可执行路径是什么。
话虽如此,你为什么需要这种烦人的行为?你不能阻止人们另眼相看。是否是为了满足某些法律要求或其他什么?