Исключение при попытке удалить обработчик события из ThreadPreprocessMessage - PullRequest
0 голосов
/ 10 мая 2011

Попытка добавить мой обработчик события в ComponentDispatcher.ThreadPreprocessMessage событие, например:

using System;
using System.Windows.Interop;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            new Cc();
        }
    }

    public class Cc
    {
        public Cc()
        {
            ComponentDispatcher.ThreadPreprocessMessage += Method;
        }

        ~Cc()
        {
            ComponentDispatcher.ThreadPreprocessMessage -= Method;
        }

        private void Method(ref MSG msg, ref bool handled)
        {
        }
    }
}

И когда я его запускаю, я получаю это исключение в деструкторе:

НеобработанныйИсключение: System.InvalidOperationException: хранилище LocalDataStoreSlot освобождено.

Что вызывает это и как его исправить?

1 Ответ

4 голосов
/ 10 мая 2011

Как состояние docs . Вызовы для регистрации и отмены регистрации хранятся в локальной структуре данных потока. Вы только что попытались отменить регистрацию в финализаторе, который выполняется в потоке финализатора (== Другой поток). Это не будет работать, так как вы должны отменить регистрацию в том же потоке, где вы зарегистрировались.

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