检测表格已被Dispose()编辑的正确方法

时间:2014-05-29 10:27:02

标签: c# winforms

如果运行以下代码,则关闭表单,获得ObjectDisposedException"无法访问已处置的对象。"尽管注释行(26)中有保护条款。

检测Form已被Dispose()d以防止发生此异常的正确方法是什么?

using System;
using System.Threading;
using System.Windows.Forms;

namespace DisposeExample
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            var handleCreated = new ManualResetEvent(false);
            Form form = null;
            ThreadStart createForm = () =>
            {
                form = new Form();
                form.Show();
                handleCreated.Set();
                Application.Run(form);
            };

            ThreadStart updateData = () =>
            {
                while (true)
                {
                    if (!form.IsDisposed) // this doesn't prevent ObjectDisposedException
//                        if (form.Visible) // this doesn't prevent ObjectDisposedException
                        form.Invoke((MethodInvoker)(() => form.Text = form.Text == "A" ? "B" : "A"));
                }
            };
            var updateDataThread = new Thread(updateData);
            updateDataThread.IsBackground = true;

            new Thread(createForm).Start();
            handleCreated.WaitOne();
            updateDataThread.Start();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果你将对象放在另一个线程中,没有任何跨线程同步,那就没有办法了。考虑一下:如果form.IsDisposed返回false,那么不同的帖子可能会在您开始form.Dispose()之前或之前致电form.Invoke

您无法可靠地阻止ObjectDisposedException被抛出,因此只需捕获异常并处理它。