在 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和文本文件。

在 C# WPF 中运行进程至少 5 秒钟

如果在用户的桌面上运行,则受安装的正确应用程序(例如 Word(及其配置方式的约束。如果这些文件是共享上的只读文件,那么我可以将它们转换为XPS,以便您可以在DocumentViewer中显示它们。而不是强迫他们等待 5 秒钟单击,让他们对他们已经阅读并理解文档的对话框说"是"。 或者像MilkyWayJoe建议的那样,在带有"我同意"按钮的页面上显示此内容。

问题可能是关联的应用程序不是单词应用程序本身,而是代表您启动单词的某个中间应用程序。

要找出答案,请保留对进程对象的引用,并检查它是否已终止,它的可执行路径是什么。

话虽如此,你为什么需要这种烦人的行为?你不能阻止人们另眼相看。是否是为了满足某些法律要求或其他什么?