回答這些問題的最佳方法是使用Reflector(或Microsoft的免費調試代碼,當它可用時)查看代碼本身。
隨着反射,你可以看到(在.NET Framework 4.0中)System.Windows.Forms.Application.Restart
查找四種不同類型的應用:
- 初步檢查
Assembly.GetEntryAssembly
是Nothing
,扔了NotSupportedException
如果是;
- 的
Process.GetCurrentProcess.MainModule.FileName
是在同一文件夾作爲當前的.NET Framework(具體的文件夾,其中限定Object
模塊是)ieexec.exe
;
ApplicationDeployment.IsNetworkDeployed
是True
;和
- 一般情況。
所有三個支持的情況都決定了再次啓動該過程的方法,調用Application.ExitInternal
並再次啓動該過程。
Application.ExitInternal
關閉打開的表單,包括通過將FormClosingEventArgs.Cancel
設置爲True
來嘗試中止關閉。如果沒有表單嘗試取消,則表單將被關閉,並使用ThreadContext.ExitApplication
清除所有ThreadConnexts
(Disposed
或調用它們的)。
NB沒有Thread.Abort
被調用,所以線程是不是明確以任何方式結束。此外,Windows.Forms
ModalApplicationContext
甚至不稱ThreadExit
「事件」,即正常的ApplicationContext
。
(請注意,在Application.Restart
所有支持的三種情況下忽略的Application.ExitInternal
的結果,因此,如果格式做嘗試中止所有發生的任何其他形式沒有得到一個機會接近,而ThreadContexts是沒有清理!)
重要的是你的問題,但它確實不企圖實際退出當前線程或整個應用程序(不是關閉打開的形式和線程上下文)等。
但是,當您的MsgBox("restarting")
執行時,新應用程序已啓動。
您需要在撥打Application.Restart
後手動退出應用程序。在「在表單中運行[ing]」的情況下(您沒有在代碼中顯示您測試的代碼),表單將被關閉,這就是您認爲的當前應用程序的結尾,或者是額外的東西Windows.Forms
(或VB)設置意味着應用程序是退出的「事件」之一,當發生清理時發生的「事件」運行。
換句話說,在測試它之前,我預計MsgBox
即使在代碼是在表格的Click
事件中也會出現,並且表單首先消失,並且應用程序同時重新啓動。
經過測試,MsgBox
試圖出現,因爲我聽到與它對應的嘟嘟聲,並且如果我將它註釋掉,則不會發出嘟嘟聲。因此,一些會導致應用程序甚至退出,雖然它應該有一個消息框打開,甚至把一個MsgBox
在Finally
外Application.Run
不會出現在Restart
。 (請注意,如果您Application.Exit
後調用MsgBox
類似的作用見圖)。
因此就成立了由Windows.Forms
(或VB)並實際調用像Environment.Exit
它調用WIN32API ExitProcess
,不把Finally
或致電Dispose
或Finalize
。
注意Application.Restart
文檔意味着它不適用於控制檯應用程序,雖然它目前工作正常(除非不立即退出,這不是暗示的Application.Exit
)。
感謝您的詳盡答覆馬克。 窗體版本只是Application.Restart(),然後MsgBox(「重新啓動」)在窗體上的按鈕的單擊事件中。沒有信息箱,沒有嘟嘟聲。 – peterG
是的,消息嗶聲會是某種競爭條件。在某些機器上,我確定你會看到消息框出現,然後消失,沒有按下OK按鈕,因爲應用程序已經調用了ExitProcess。我尚未確認此通話設置的位置。 –