在引发线程事件时无法访问已处置的对象

时间:2016-06-12 00:14:27

标签: c# multithreading events .net-4.0 thread-safety

我的课我写的是使用多线程,我有我为我的类创建的扩展方法,以线程安全的方式引发事件。

static class MultiThreadHelper
{
    public static object Raise(this MulticastDelegate eventToRaise, object sender, EventArgs e)
    {
        object retVal = null;

        MulticastDelegate threadSafeMulticastDelegate = eventToRaise;
        if (threadSafeMulticastDelegate != null)
        {
            foreach (Delegate d in threadSafeMulticastDelegate.GetInvocationList())
            {
                var synchronizeInvoke = d.Target as ISynchronizeInvoke;
                if ((synchronizeInvoke != null) && synchronizeInvoke.InvokeRequired)
                {
                    retVal = synchronizeInvoke.EndInvoke(synchronizeInvoke.BeginInvoke(d, new[] { sender, e }));
                }
                else
                {
                    retVal = d.DynamicInvoke(new[] { sender, e });
                }
            }
        }

        //Return the value of the event invocation or null if none.
        return retVal;
    }
}

当我的表单试图关闭一个挥之不去的线程时,仍在尝试报告,并引发一个不再有处理程序的事件。

我最终得到以下错误......

enter image description here

在发生线路错误之前,我可以运行哪种检查?我还能做些什么,或者采取不同的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

我的第一个想法是ManifestBuilder在关闭时不会取消订阅。确保使用-=语法取消订阅。