2016-07-27 94 views
0

我在這裏有一個大問題,無法修復它。我正在開發一款工作更新軟件,即使在運行流程的計算機上也需要工作。因此,如果複製或其他處理導致異常,我需要終止導致錯誤的進程並重試並繼續更新。問題是我殺了這些進程,但窗口繼續告訴我,即使我殺了它們,也有一些進程被打開。如何在殺死進程後避免IOException?

所以我有一臺計算機上覆制更新的文件,其中進程正在運行的方法。我使用了Process.GetProcessesByName(「processName」)和下面的解決方案來終止進程。

Using C#, how does one figure out what process locked a file?

這是我的代碼:

try 
{ 
    file.CopyTo(destAbsolutePath, true); 
} 
catch (IOException ioException) 
{ 
    foreach (var process in Process.GetProcessesByName(file.Name.Replace(Path.GetExtension(file.Name), ""))) 
    { 
     process.Kill(); 
    } 
    foreach (Process p in Win32Processes.GetProcessesLockingFile(file.FullName)) 
    { 
     p.Kill(); 
    } 
    file.CopyTo(destAbsolutePath, true); 
} 

我問我的Windows是否需要時間去了解,如果一個進程被殺死。我試圖等一下,但沒有發生。如果我在殺掉這些進程並重新打開之後關閉了我的應用程序,則不會再出現錯誤。如果我用GetCurrentProcess.Kill()殺死了我的應用程序,錯誤就停留在那裏。我不認爲這是我的應用程序導致IOException,因爲我只循環FileInfo對象。

我想這個解決方案來檢查,如果我的文件(我殺過程中使用的一個.dll自定義文件)被殺死誰用我的.dll文件的過程後,鎖定它wan't鎖定:

Is there a way to check if a file is in use?

請幫幫我。 感謝

回答

0

你有一個競爭條件,我認爲。 Kill方法異步退出;在繼續之前調用WaitForExit方法等待它退出。如果這些進程有一個用戶界面,你也可以考慮CloseMainWindow方法,這是一個更「有序」的關閉程序的方式(但是調用可能會失敗 - 例如程序可能拒絕關閉 - 所以你必須檢查是否調用成功)。

+0

我試圖調用WaitForExit(),但問題留在那裏。最後,即使我殺了我的應用程序並重新打開它,我也有錯誤。 –

+0

哦,我重試了2-3分鐘後,最後一個錯誤重新啓動我的程序,並沒有更多的錯誤......這個問題應該是什麼? –

+0

好的,我發現了這個問題,但我需要有人幫助我解決它。在我的工作中,有幾臺電腦組成的模擬器。我需要殺死所有計算機上的進程。那麼如果我知道計算機已經連接並一起工作,那麼如何列出所有計算機進程呢? –

0

好吧,我發現這個問題,但我需要有人來幫我解決這個問題。在我的工作中,有幾臺電腦組成的模擬器。我需要殺死所有計算機上的進程。那麼如果我知道計算機已經連接並一起工作,那麼如何列出所有計算機進程呢?

這意味着訪問文件共享並保持文件打開。文件共享文件句柄由內核擁有。你根本無法關閉它們。進程查找邏輯不適用於此處。

您需要確保文件共享的客戶端停止訪問共享。或者,您可以刪除共享或踢所有當前連接的客戶端。我認爲消除分享是最好的選擇,因爲它是免費的競賽條件,它不依賴於殺死某些東西。

那麼如果我知道計算機已經連接並一起工作,那麼如何列出所有計算機進程呢?

這是一個不同的問題。這應該已經記錄在網絡上。