【问题标题】:Not able to interact with wpf element while a method executing [duplicate]执行方法时无法与 wpf 元素交互
【发布时间】:2017-08-18 05:29:55
【问题描述】:

我创建了一个带有 2 个按钮的 WPF 应用程序。单击第一个按钮执行 cmd 并等待命令完成,因为我需要在执行完成后读取结果文件。在第二个按钮上单击我正在通过进程终止停止执行 cmd。

但是在开始命令执行后,我无法在完成 cmd 执行之前停止执行。

有没有并行执行的方法?

开始按钮代码

string filename = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "nunit-console.exe");
 Process proc = Process.Start(filename, "/result:" + resultFile + ".xml " + fileName);
proc.WaitForExit();

【问题讨论】:

  • 使用Multithreading,因为你的主线程在等待proc.WaitForExit();时被冻结
  • @Nobody 是正确的。稍微说明一下,您的 UI 有自己的线程,并且需要遵循一些规则才能让您的 UI 更新或更改其他线程。查看异步/等待和更新到/从 UI 线程。大量示例和教程。
  • 请注意,您可能需要也可能不需要使用WaitForExit()。这取决于您没有费心展示的其余代码。 Process 类提供异步处理 I/O 和状态处理。参见例如stackoverflow.com/questions/2085778/…。在后台任务或线程中运行上述代码是从字面上阅读问题的最明显方法,但还有其他方法可以解决它。

标签: c# wpf


【解决方案1】:

只需删除proc.WaitForExit();。此行阻塞了接口线程,阻止了第二个按钮点击被注册。

    System.Diagnostics.Process proc;

    private void Btn1Click(object sender, RoutedEventArgs e)
    {
        string filename = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "nunit-console.exe");
        proc = Process.Start(filename, "/result:" + resultFile + ".xml " + fileName);
    }

    private void Btn2Click(object sender, RoutedEventArgs e)
    {
        if (proc != null)
            proc.Kill();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多