2008-11-19 59 views
5

我在程序中編寫了一個功能,用戶可以編輯存儲在數據庫中的文檔,它將文檔保存到臨時文件夾,然後使用Process.Start將文檔啓動到編輯應用程序中,例如Microsoft Word。C#的Process.Start,如何防止重複使用現有應用程序的?

然後我的應用程序需要等待,直到他們已經關閉了被叫流程與此臨時文件夾中的新編輯的副本替換該文件在數據庫中。

下面的代碼,只要偉大工程作爲被叫應用尚未運行:

ProcessStartInfo pInfo = new ProcessStartInfo(); 
pInfo.FileName=TempFolder + Path.DirectorySeparatorChar + f.Name; 
Process p = new Process(); 
p.StartInfo = pInfo; 
p.Start(); 
//p is null at this point if called application was already running 
//i.e. Microsoft Word is re-used instead of starting a fresh copy 
p.WaitForInputIdle(); 
p.WaitForExit(); 

有沒有辦法來開始一個全新的工藝或任何人都可以想別的辦法來處理這個。我真的不希望用戶能夠做任何事情在我的應用程序,直到他們已經關閉了所謂的過程,因爲我需要知道,如果他們編輯的文件或沒有在那個時間點,而不是後來當各種其他問題可能會蔓延。

+0

編輯標籤纔會更加通用化,以便在更多供稿中看到問題。 – 2008-11-19 21:33:14

回答

0

經過進一步的研究,並通過一些提到WaitForExit和過程'已退出事件的不可靠性的帖子後,我提出了一個完全不同的解決方案:我開始這個過程,不用等待它,只需彈出一個模式對話框,在該對話框中用戶可以點擊更新以在臨時文件夾文件編輯並保存臨時文件或取消時將其更新回數據庫。

這種方式在他們手中,我不必依賴Process.Start的變幻莫測。

感謝大家的幫助。

0

我不知道關於啓動一個新的進程,但你有沒有考慮這個邏輯等到退出:

而(Process.IsRunning){}

基本上只是一個持有者循環,直到你過程完成。

+1

如果重新使用現有應用程序,則在調用開始後立即爲空。 – JohnC 2008-11-19 21:04:51

0

是,訂閱過程已退出事件和process.EnableRisingEvents屬性設置爲true。然後讓您的應用程序不執行任何操作,直到Exited事件被觸發!

關於強制使用新進程,我認爲這是默認行爲,我認爲這取決於您調用的進程,如果它允許多個實例同時運行或不運行,你的控制......不幸的。

祝你好運!

+0

遺憾的是兩個步驟:在調用開始後立即爲空,如果它重新使用並且如果它們已經爲另一個文檔打開了應用程序,我會凍結,直到它們關閉爲止。 – JohnC 2008-11-19 21:06:45

+0

嗯...你有沒有嘗試擺脫最後兩行:p.WaitForInputIdle(); p.WaitForExit(); ?然後在調用start()之前,認可Exited並將EnableRisingEvents設置爲true() – 2008-11-19 21:10:48

0

我覺得你使用了錯誤的方法解決問題。如果你只是處理word文檔,我相信你應該使用COM interop從你的應用程序中單詞和控制單詞。通過COM你可以控制所有的單詞,你可以用文字打開文檔,並且當用戶關閉它時你就會知道。

+0

不是,它不僅僅是文檔,這僅僅是一個例子,它可以是任何類型的文件。 – JohnC 2008-11-19 22:23:58

2

就我個人而言,我不確定我是否同意這種方法。顯示模式表單可能會使您擺脫這種情況,但在大多數情況下,當解決方案似乎很難找到時,改變您嘗試解決的問題很有幫助。

選項1:

在這種情況下,我建議你簽出/簽入的模式。這將允許用戶「檢出」文件到他們的機器,然後在他們完成更新時檢查它。這具有許多優點:

  • 他們可以一次編輯多個文檔,並一次對多個文檔執行簽入操作。
  • 他們可以將註釋應用於簽入。
  • 用戶可以關閉他們的電腦,或者脫機並仍然在他們的文檔上工作。
  • 用戶可以在本地簽出多個文件,然後將工作帶回家。
  • 當文檔打開時,如果電腦崩潰(或筆記本電腦電池電量耗盡),以及如何再次將它們重新組合在一起,則不必嘗試解決該怎麼做。

該模型也很適合創建新文檔並將其添加到數據庫的概念。這與簽入相同。

您可以輕鬆提供顯示誰擁有簽出文件以及他們的「工作副本」位置的報告。

我會承認,通常只有開發人員對此模型感到滿意,並且您可能需要投資少量的再培訓。我認爲設置一個自動提醒系統並不難,因爲他們在長時間檢出文件時會向他們發送電子郵件。

選項2:

觀看使用FileSystemWatcher的或等效的文件。這將使您能夠密切關注該文件,並且當用戶執行保存操作時,您可以提交到數據庫。畢竟,只有當用戶實際上保存了您有興趣更新數據庫的文件時,

相關問題