Гость
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Метод Dispose для ViewModel не вызывается / 5 сообщений из 5, страница 1 из 1
10.09.2020, 10:37
    #39997181
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Метод Dispose для ViewModel не вызывается
Всем привет, пишу WPF-приложение на Core, в которой есть MainViewModel.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public  class MainViewModel:
        BaseViewModel, IDisposable
    {
        private  SerialPort _serialPort;

        public MainViewModel()
        {
            _serialPort = new SerialPort("COM3", 19200, Parity.None, 8, StopBits.One);
            _serialPort.Open();

            _serialPort.DataReceived += _serialPort_DataReceived;
            _serialPort.ErrorReceived += _serialPort_ErrorReceived;

            CloseConnections = () => {
                _serialPort.Close();
                _serialPort.DataReceived -= _serialPort_DataReceived;
                _serialPort.ErrorReceived -= _serialPort_ErrorReceived;
            };

        }

        private async void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
        {
        }

        private async void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {                
        }

        public void Dispose()
        {
            Debug.WriteLine("I was disposed________________________________________");
        }

    }






В ней я открываю порт для прослушки и подписываюсь на события получения данных и ошибки получения данных.
Инициализирую MainViewModel и MainWindow через DI-container от Core.

App.xaml.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 protected override void OnStartup(StartupEventArgs e)
        {
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            ServiceProvider = serviceCollection.BuildServiceProvider();
            var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
            mainWindow.DataContext= ServiceProvider.GetRequiredService<MainViewModel>();          
            mainWindow.Show();
        }

    private void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<MainWindow>();
            services.AddSingleton<MainViewModel>();
        }



Мне необходимо при закрытии приложения освобождать ресурсы и отписываться от подписок на событий.
Понимаю, что это сейчас и так сделается, когда приложение перестает функционировать, но хотелось бы сделать более универсальный случай, когда MainViewModel больше не нужна.

Проблема в том,что метод Dispose не вызывается никак. Я закрываю приложение- не вызывается.
Очень не хотелось бы бы подписываться на событие OnClosing окна или другие какие-либо UI-события.
Паттерн IDisposable тоже не подходит, потому что нет необходимости вызывать метод Dispose в MainViewModel извне.
Как можно корректно очистить ресурсы? Спасибо
...
Рейтинг: 0 / 0
10.09.2020, 11:41
    #39997201
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Метод Dispose для ViewModel не вызывается
Вы регистрируйте его как синглтон, почему он должен удаляться? такой объект создается 1 раз, это же не Scope
...
Рейтинг: 0 / 0
10.09.2020, 11:43
    #39997203
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Метод Dispose для ViewModel не вызывается
Roman Mejtes,
Когда я закрываю приложение, он должен ведь удалиться.
...
Рейтинг: 0 / 0
10.09.2020, 11:59
    #39997214
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Метод Dispose для ViewModel не вызывается
vb_sub,

всё зависит от того, что вы понимаете от "закрываю приложение".
когда приложение завершает работу, вся память которая была ему выделена освобождается.
судя по вашему коду, в вас есть какой то ридер из последовательного порта, скорее всего внутри создается отдельный поток который читает данные с порта, пока этот поток не завершится, ваша программа будет работать (правда я не работал с этими типами). Потом может быть создан как важный и неважный, в 1 случае процесс будет ждать завершения потока, а во 2 нет. (не помню как это точно называется).
Следовательно, перед тем как закрыть приложение вам нужно прекратить читать данные с порта и освободить этот ресурс.
Наверное там есть методы типа Close() и Dispose()
...
Рейтинг: 0 / 0
11.09.2020, 08:35
    #39997526
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Метод Dispose для ViewModel не вызывается
Roman Mejtes,
просто не хочется попасть в ситуацию как с VB6 и Excel. Когда в коде работаешь с Excel-объектом, некорректно его закрываешь. Закрываешь приложение и Excel остается висящим в процессах диспетчера задач.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Метод Dispose для ViewModel не вызывается / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]