簡體   English   中英

在第一個關閉后,如何聲明第二個新的Application對象?

[英]How can I declare a second, new Application object after the first has shut down?

此問題與重新啟動應用程序有關。

我已經看到了這個問題。 但是,這個問題(據我所知)已經有近十年的歷史了,而且似乎都沒有一個答案可以回答這個特定的問題(關於如何定義第二個Application對象的問題)其.Shutdown方法稱為)。

嘗試在第一個具有其.Shutdown( )方法調用的new App( )后聲明以下異常:

在此處輸入圖片說明

我可以用原始的App對象做任何事情來防止他發生嗎?

符合最小,完整和可驗證示例的要求:

確定App.xaml構建操作已設置到Page

App.xaml.cs:

using System;

namespace MCVE {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
    public partial class App {
        private static bool _isRestarting = true;
        public static bool IsRestarting {
            get => _isRestarting;
            set => _isRestarting = value;
        }

        [STAThread]
        public static void Main( ) {
            while ( IsRestarting ) {
                IsRestarting = false;
                App program = new App( );
                program.InitializeComponent( );
                program.Run( );
            }
        }
    }   
}

MainWindow.xaml:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="MCVE.MainWindow"
    mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
    <UniformGrid Rows="1">
        <Button Content="Restart" Click="Restart" />
        <Button Content="Exit" Click="Shutdown" />
    </UniformGrid>
</Window>

MainWindow.Xaml.cs:

using System.Windows;

namespace MCVE {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow( ) {
            InitializeComponent( );
        }

        private void Restart( object sender, RoutedEventArgs e ) {
            App.IsRestarting = true;
            Shutdown( sender, e );
        }

        private void Shutdown( object sender, RoutedEventArgs e ) =>
            Application.Current?.Shutdown( );
    }
}

重現:單擊顯示Restart的按鈕。

Application類被設計為只能運行一次,並與其加載到的AppDomain的生存期相關聯。 即使您找到解決該問題的方法,也將與使用該類的意圖背道而馳。 (請參閱此處的備注部分。)

我建議不要退后一步,而是退后一步,思考您要達到的目標。 如果要重新啟動整個應用程序,請考慮啟動一個新進程。 如果要卸載然后重新加載一堆東西,請在單個Application實例范圍內的適當級別將該功能構建到代碼中。

根據您要完成的工作,您可能還需要考慮閱讀AppDomain (可以從此處開始,但是如果您四處搜索,可能會有更好的資源)。 AppDomain專門設計為一個封裝的獨立競技場,您可以在其中通過加載和卸載整個域來加載和卸載一堆東西。

我相信也可以在每個域中運行一個Application實例,但是我從未嘗試過類似的方法。 如果執行這樣的操作,則可能應避免在默認域中運行Application實例,因為除非關閉進程,否則永遠無法卸載該域。

暫無
暫無

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

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