2017-08-17 113 views
-1

我創建了一個帶有2個按鈕的WPF應用程序。在執行cmd的第一個按鈕的點擊並等待命令的完成,因爲我需要在執行完成後讀取結果文件。在第二個按鈕上單擊我停止執行cmd進程kill。執行方法時無法與wpf元素進行交互

但是在啓動命令執行後,我無法在完成cmd執行之前停止執行。

是否有任何並行執行方式?

開始按鈕代碼

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

使用[多線程(https://www.tutorialspoint.com/csharp/csharp_multithreading.htm),因爲它等待'proc.WaitForExit()你的主線程被凍結;' –

+0

@Nobody是正確的。細化一下,你的UI有它自己的線程,並且需要遵循一些規則來使你的UI更新或更改其他線程。研究異步/等待和更新到/從UI線程。那裏有大量的例子和教程。 –

+0

請注意,您可能或可能不需要使用'WaitForExit()'。這取決於其他代碼,這是你沒有打算展示的。 Process類提供異步處理I/O和狀態處理。見例如https://stackoverflow.com/questions/2085778/c-sharp-read-stdout-of-child-process-asynchronously。在後臺任務或線程中運行上述代碼是最直觀的解決問題的方法,但還有其他解決方法。 –

回答

0

只需卸下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(); 
    } 
相關問題