代码之家  ›  专栏  ›  技术社区  ›  Álvaro García

如何关闭或禁用自助主机服务?

  •  0
  • Álvaro García  · 技术社区  · 7 年前

    我有一个承载服务的WPF应用程序,其背后的代码是:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            _host = new ServiceHost(typeof(GestorAplicacionesService));
            _host.Open();
        }
        private ServiceHost _host;
    }
    

    我已经读到关闭服务是一种很好的做法,但我不知道在这种情况下如何做?因为我有一个主窗口,如果我关闭应用程序,我可以在关闭事件中关闭服务。然而,如果有一些异常可能会破坏没有触发关闭事件的应用程序,那么服务就不会关闭。

    所以我想知道,当服务托管在wpf应用程序中时,如何关闭它才是最好的方法。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    处理 Closing 事件并将其关闭。您可能还希望实现 IDisposable 处理一次性字段最佳实践的接口:

    public sealed partial class MainWindow : Window, IDisposable
    {
        private readonly ServiceHost _host = new ServiceHost(typeof(GestorAplicacionesService));
    
        public MainWindow()
        {
            InitializeComponent();
    
            _host.Open();
            Closing += MainWindow_Closing;
        }
    
        private void MainWindow_Closing(object sender, CancelEventArgs e)
        {
            Dispose();
        }
    
        public void Dispose()
        {
            _host.Close();
            _host.Dispose();
        }
    }
    

    这是你能做的最好的了。如果整个进程意外关闭,那么在WPF应用程序中就没有什么可做的了。内存仍将返回到操作系统。

        2
  •  0
  •   Jophy job    7 年前

    您可以在应用程序中检查所有内容。xaml

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
    
            base.OnStartup(e);
        }
    
        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            ((MainWindow)Application.Current.MainWindow).host.Close();
        }
    
        protected override void OnExit(ExitEventArgs e)
        {
            if (((MainWindow)Application.Current.MainWindow).host.State == System.ServiceModel.CommunicationState.Opened)
                ((MainWindow)Application.Current.MainWindow).host.Close();
    
            base.OnExit(e);
        }
    

    有关线程问题,请访问以下链接: https://soumya.wordpress.com/2010/05/26/wcf-simplified-part-7-hosting-a-wcf-service-using-wpf/