【问题标题】:process.start launches exe twiceprocess.start 两次启动 exe
【发布时间】:2014-12-07 15:45:50
【问题描述】:

我希望有人可以帮助我解决这个问题。我正在尝试使用 Windows 窗体中的 Cisco AnyConnect 内置工具运行 DART 捆绑包。当我使用 Process.Start 或 System.Diagnostics.Process.Start 调用 exe 时,在单击事件中它会复制命令。然后我让进程同时运行两次。我可以使用 Process.Start 毫无问题地调用 Cisco Connection GUI。代码如下。还有一种方法可以将 MsgBox("Textwritten to file") 延迟到 DART Bundle 完成之后?

Private Sub Button6_Click(sender As Object, e As RoutedEventArgs) Handles Button7.Click
        System.Diagnostics.Process.Start("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe")
        MsgBox("Text written to file")
        Button7.Background = System.Windows.Media.Brushes.Green
    End Sub

【问题讨论】:

    标签: vb.net winforms process.start


    【解决方案1】:

    很可能,进程启动没有被调用两次,但事件被触发了两次。 放置一个断点并检查它。 如果是,那么您可以很容易地在调用堆栈中找到问题。

    而且,是的,您可以延迟消息。 据我了解,此 DART Bundle 执行、将数据输出到文件并退出。

    因此,您可以使用以下代码来解决问题。它在 C# 中,但在 VB.NET 中应该相同或相似。

    Process.Start("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe");
    Process.WaitForExit();
    MessageBox.Show("Text written to file.");
    

    WaitForExit() 将同步等待直到进程结束。 或者,如果您不希望您的应用程序被阻止,您可以订阅 Process.Exited 事件。

    private void YourMethod()
    {
        Process process = new Process();
        process.StartInfo.FileName = "C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe";
        process.Exited += new EventHandler(Process_Exited);
        process.Start();
    }
    
    private void Process_Exited(object sender, EventArgs e)
    {        
        MessageBox.Show("Text written to file");
    }
    

    【讨论】:

    • 我放了一个断点,我看到它在按钮颜色更改后再次启动按钮事件。中断将在Button7.Background.System.Windows.Media.Brushes.Green 停止,然后当我单击继续时,它会重新启动 dartcli.exe。如何找到调用堆栈来纠正这个问题?请原谅我的无知,我是 VB 编程的新手。谢谢
    • 我实际上只是尝试以这种方式重写命令Dim dart As System.Diagnostics.Process = System.Diagnostics.Process.Start("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe") dart.WaitForExit(),但它仍然会启动该事件两次。它还会再次调用整个表单。所以现在我的进程运行了两次,屏幕上有两个表单。
    • @LordDaius 你能上传完整的 .cs 和 .designer.cs 文件吗?你可以使用 pastebin.com 来做。
    • @D0KZ 我无法使用 pastebin.com,公司防火墙阻止了它。有没有更好的方法来粘贴表格?它们是 xaml.vb 和 xaml
    • 感谢Waitforexit() 命令。现在程序停止了两次调用该事件,它就像一个魅力。
    【解决方案2】:

    所以我似乎找到了我遇到问题的原因。当我创建按钮时,单击事件名称出现错误(不小心重复了名称),我让 Visual Studio Express 自动更正了这些问题。它在按钮单击事件的末尾添加了一个处理程序,导致按钮调用代码两次。我删除了处理程序,它停止调用两次。

    我从这里出发

    Private Sub Button6_Click(sender As Object, e As RoutedEventArgs) Handles Button7.Click
        System.Diagnostics.Process.Start("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe")
        MsgBox("Text written to file")
        Button7.Background = System.Windows.Media.Brushes.Green
    End Sub
    

    到这个。问题解决了

    Private Sub Button6_Click(sender As Object, e As RoutedEventArgs)
        System.Diagnostics.Process.Start("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\dart\dartcli.exe")
        MsgBox("Text written to file")
        Button7.Background = System.Windows.Media.Brushes.Green
    End Sub
    

    感谢大家的时间和帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多