尝试从ThreadPreprocessMessage中删除事件处理程序时的异常

时间:2011-05-09 20:16:48

标签: c# exception interop

尝试将我的事件处理程序添加到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 个答案:

答案 0 :(得分:4)

作为docs州。寄存器和取消注册调用存储在线程本地数据结构中。您刚刚尝试在终结器线程(==不同线程)上运行的终结器中取消注册。这不起作用,因为您必须在注册的同一个线程上取消注册。