簡體   English   中英

停止執行C#代碼

[英]Stop executing C# code

我正在玩一些C#Winforms / WPF代碼,偶然發現了一些奇怪的東西。 假設我有這樣的代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DoSomething();

        // maybe something more if everything went ok
    }
}

令我困惑的是,我不能簡單地在構造函數完成其工作之前從方法DoSomething關閉應用程序。 如果DoSomething執行過程中出現任何問題,我需要立即關閉應用程序,但它只是繼續運行,執行部分// maybe something more...然后關閉,但這對我來說太遲了。

我必須在構造函數本身中放入用於關閉表單的代碼,並return;以下內容return; 然后它工作,但我真的沒有找到一個可接受的解決方案。 我試圖將這樣的驗證邏輯從構造函數移動到我的方法。

我嘗試過類似的東西

public void DoSomething()
{
    Close();
}

要么

public void DoSomething()
{
    Application.Current.Shutdown();
}

但它似乎沒有用。 是的,兩個代碼都會關閉應用程序,但僅在完成構造函數代碼之后。

Why需要這樣的東西? 好吧,因為在啟動時我需要檢查各種事物,如連接和硬件的可用性,驗證用戶等,如果有任何失敗,沒有必要執行更多的代碼。

使用Winforms和WPF(因此標簽)嘗試相同的原理,工作原理相同。

任何人都可以提供解釋或解決方案嗎?

只是嘗試在你的情況下使用Environment.Exit(-1) ,一切都會很好。

補充: 這是我能為您提供的最佳參考。

Application.ExitApplication.ShutdownEnvironment.Exit之間的區別

Application.Exit()用於以優雅的方式退出Windows窗體應用程序。 基本上,它會停止消息泵,關閉所有窗口,並在調用Application.Run()之后立即返回Main()方法。 但是,有時它似乎不起作用 - 這通常是因為還有其他前台線程(除了UI線程)仍在運行,這阻止了線程結束。

Application.Shutdown() (廣泛地)等同於WPF應用程序中的Application.Exit()。 但是,您可以設置ShutDownMode,以便在主窗口關閉,最后一個窗口關閉或僅在調用此方法時關閉應用程序。

Environment.Exit()殺死所有正在運行的線程,並且進程本身就會死機。 當更優雅的方法由於某種原因不起作用時,這應僅在WF或WPF中作為最后的手段使用。 它還可用於從控制台應用程序突然退出。

另一個參考: 如何正確退出C#應用程序?

您可以隨時忽略您的開發人員,只需使用Environment.FailFast()

但是真的 - 不要。 如果您有重要的事情要做,SA驗證串口是否與核電站連接,請事先做好。 調用Main()沒有規則強制您進入Application.Run(...)

已經為您的問題找到了可行的解決方案。

只是為了回答你的后續問題:Close()和Shutdown()之類的方法沒有立即退出你的應用程序的原因是它們只是將消息推送到應用程序的消息隊列中。 它們僅在MainWindow的構造函數完成后處理,並且代碼執行返回到消息處理循環,甚至在處理了隊列中的其他一些待處理消息之后也是如此。 相反,像Environment.Exit()或Environment.FailFast()這樣的方法是一種硬核os函數,導致或多或少立即殺死進程。

解決方法是拋出異常並在application.UnhandledException處理它

定義一個Exception類:

public class InitializationException : Exception
{
    public InitializationException()
    {}

    public InitializationException(string msg)
        : base(msg)
    {}

    public InitializationException(string msg, Exception inner)
        : base(msg, inner)
    {}
}

並改變你的代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        try
        {
            DoSomething();

            // maybe something more if everything went ok
        }
        catch( InitializationException ex )
        {
            // log the exception
            Close();
        }
    }

    public void DoSomething()
    {
        if (notSomethingOK)
            throw new InitializationException( "Something is not OK and the applicaiton must shutdown." );
    }
}

這是一個干凈且可維護的解決方案。

System.Windows.Forms.Application.Exit();

從概念上講,這些事情不應該在類構造函數中使用。 構造函數在某種程度上是用於初始化狀態而不是實際的事情(如異常,消息框等)。

不要忘記你可以回來; 來自構造函數,如果你需要打破它的執行。 這是更好的策略(大多數情況下,您不需要在不顯示某些文本的情況下關閉錯誤的應用程序)。

在Windows / WPF上有“窗口顯示”,“可見性已更改”,“已加載”以及C#中的許多其他事件,您可以虛擬覆蓋或添加為事件處理程序。 在那里初始化您的表單/應用程序。

它們是正常的方法,所以一切都按預期工作。 您可以嘗試拋出應用程序入口點(主要功能)將捕獲和忽略的異常。

對於WPF,請檢查: - https://msdn.microsoft.com/en-us/library/system.windows.forms.application.setunhandledexceptionmode(v=vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM