如果运行以下代码,则关闭表单,获得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();
}
}
}
答案 0 :(得分:2)
如果你将对象放在另一个线程中,没有任何跨线程同步,那就没有办法了。考虑一下:如果form.IsDisposed
返回false
,那么不同的帖子可能会在您开始form.Dispose()
之前或之前致电form.Invoke
。
您无法可靠地阻止ObjectDisposedException
被抛出,因此只需捕获异常并处理它。