C# — плавающий глюк — насколько правильно исправил?

Есть метод:

private void Web_TitleChanged(object sender, TitleChangedEventArgs e)
        {
                Invoke(new Action(() => Text = e.Title));
        }

Редко, но бывает - закрывается приложение, воспользовался отладчиком, т.к. отловил момент - отладчик вывел в строке Invoke................ - ошибку: "Доступ к ликвидированному объекту невозможен".

Нашел одно решений, проверять на IsDisposed:

Сделал так:

private void Web_TitleChanged(object sender, TitleChangedEventArgs e)
        {
            if (!IsDisposed)
            {
                Invoke(new Action(() => Text = e.Title));
            }
        }

Насколько корректно сделано? Просто ошибка очень может не отлавливаться и не хотелось бы обратно возвращаться к такому.
  • Вопрос задан
  • 294 просмотра
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Подпишись на событие FormClosing (если ещё не подписан) и в его обработчике отпишись от обработчиков событий TitleChanged, AddressChanged, LoadingStateChanged:
public partial class BrowserMain : Form
{
    public BrowserMain()
    {
        InitializeComponent();
        
        WebBrowser = new ChromiumWebBrowser(
            string.IsNullOrWhiteSpace(address) ? "about:blank" : address)
        {
            // ...
        };

        Controls.Add(WebBrowser);

        WebBrowser.TitleChanged += WebBrowser_TitleChanged;
        WebBrowser.AddressChanged += WebBrowser_AddressChanged;
        WebBrowser.LoadingStateChanged += webBrowser_DocumentCompleted;
    }

    private void BrowserMain_FormClosing(object sender, FormClosingEventArgs e)
    {
       // После вызова этих строк методы WebBrowser_TitleChanged, WebBrowser_AddressChanged
       // и webBrowser_DocumentCompleted не будут выполняться. 
       // Это и не нужно, так как окно закрывается.
        WebBrowser.TitleChanged -= WebBrowser_TitleChanged;
        WebBrowser.AddressChanged -= WebBrowser_AddressChanged;
        WebBrowser.LoadingStateChanged -= webBrowser_DocumentCompleted;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы