2015-10-08 65 views
1

基於此https://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx Process.Start()沒有用。如何總是在C#中運行新進程的實例?

開始可能會返回一個非空進程,其HasExited屬性 已設置爲true。在這種情況下,啓動的進程可能會激活 自身的現有實例,然後退出。

在我的情況下,我想在新實例中啓動一個xml的默認編輯器,以便我可以使用Process.HasExited屬性對我的WPF應用程序執行操作。我所看到的只是原生樣本或複雜的想法。什麼是最好的解決方案?

Process process = Process.Start(MyFileXMlPath); 
//Wait for the Editor to be closed. 
if (process != null) 
    while (!process.HasExited) ; 

這就是我現在擁有的。所以我使用用戶的首選編輯器。

+0

你能解釋一下現在發生了什麼嗎?它工作與否?你只是擔心這個警告,或者你有時會用'HasExited'屬性來處理'true'? – KOTIX

+0

它總是在正在運行的進程窗口之一中打開XML。此外,進程句柄爲空,我的應用程序不會等待用戶完成並關閉窗口以對該新的xml文件執行操作。所以,如果我讓Process.Start(MyFileXMLPath)始終啓動一個新實例,所有問題都解決了。 – anotheruser

回答

1

發生了什麼是預期的行爲 - 編輯器被要求打開一個文件,並在現有的運行過程中打開該文件。一種解決方案可能是使用Process.GetProcesses來獲取盒子上的所有正在運行的進程並遍歷它們以找到新進程,但這可能是有問題的,因爲確實沒有辦法確定哪一個打開文件。

你可能想要做的就是將UseShellExecute設置爲false,明確運行你想要的編輯器(例如@「c:\ Windows \ notepad.exe」)並將文件名作爲參數傳遞,通常是約定打開文件。顯然,你會想選擇一個不調用現有實例的編輯器。

+0

似乎我的要求是非常嚴格的(至少到目前爲止)使用用戶的優先編輯。因此,我將使用Interops和Native API來查找默認編輯器,並使用ProcessInfo單獨啓動該程序。將更新此解決方案的線程。看來這是唯一的方法...? – anotheruser

+0

這可能無濟於事。編輯器本身就是決定使用現有進程而不是shell。 –

+0

關閉:我通過閱讀AssocProgram文件擴展名並使用我的文件路徑啓動該程序來修復它。這總是啓動新的實例。 – anotheruser

相關問題