Как закрыть или отказаться от самостоятельного хостинга? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть приложение WPF, в котором размещается служба, код такой:

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

        _host = new ServiceHost(typeof(GestorAplicacionesService));
        _host.Open();
    }
    private ServiceHost _host;
}

Я прочитал, что закрывать службу полезно, но не знаю, как это сделать.это в этом случае?Поскольку у меня есть главное окно, что, если я закрою приложение, я могу закрыть сервис в событии закрытия.Однако, если есть какое-то исключение, которое может сломать приложение, которое не запускает событие закрытия, то служба не будет закрыта.

Так что мне было интересно, как это будет лучшим способом закрытьслужба, размещенная в приложении wpf.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Обработайте событие 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.Память все равно будет возвращена операционной системе.

0 голосов
/ 10 февраля 2019

вы можете проверить, что все в app.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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...