如何解决ObjectDisposedException未处理?

时间:2016-10-01 13:26:44

标签: c# error-handling

所以我正在尝试为教育目的编写一个简单的代码,它从文本框中获取一个字符串并将其写入txt文件。每次第二次按下按钮时,都会收到以下错误消息:Error Message

以下是代码:

StreamWriter sw = new StreamWriter("somefile.txt");
    private void button1_Click(object sender, EventArgs e)
            {
                string textBoxStuff = textBox1.Text;
                textBox1.Text = "";
                using (sw)
                {
                    sw.WriteLine(textBoxStuff);
                }
            }

4 个答案:

答案 0 :(得分:1)

你可能已经在其他地方调用了StreamWriter上的dispose。

您可以尝试此操作(使用尚未处置的新实例):

private void button1_Click(object sender, EventArgs e)
{
    string textBoxStuff = textBox1.Text;
    textBox1.Text = "";
    using (var streamWriter = /*create your StreamWriter instance somehow*/)
    {
        streamWriter.WriteLine(textBoxStuff);
    }
}

根据经验,我不会在使用块中放置任何类字段,而只在本地方法变量上使用它。

如果由于某种原因你需要IDispossable字段并且你需要在所有类生命周期中保持它活着,我使类实现IDispossable并且在dispose方法中我调用该字段的dispsoe方法。

答案 1 :(得分:1)

因为您在第一次按下按钮后明确告诉它关闭sw。

            using (sw)
            {
                sw.WriteLine(textBoxStuff);
            }

在using()语句的末尾,处理正在使用的对象。所有的使用陈述都是,它基本上是以下语法糖:

            try
            {
                sw.WriteLine(textBoxStuff);
            }
            finally
            {
                sw.Dispose();
            }

在这种情况下,你的变量sw保持在范围内并且仍可用于按下第二个按钮,但是当调用Dispose()时,按下第一个按钮已经关闭了文件。如果您真的打算在此表单的生命周期内保持文件处于打开状态,那么您不希望在此处使用using,您希望在更合适的位置处理该对象。

另一个选项是不要在表单的整个生命周期内保持文件打开,而是每次按下按钮时打开和关闭它。在这种情况下,您可以创建一个本地streamwriter对象并将其放在using语句中。

答案 2 :(得分:0)

在尝试显示已关闭的表单时,我收到了相同的错误消息。

以下是解决问题的方法;

if (myForm.IsDisposed)
            myForm = new Form();
myForm.Show();

答案 3 :(得分:-1)

检查文本撰写者是否引用了有效文件:

using (TextWriter writer = File.CreateText("C:\\perl.txt")) // Check the file here
    {

        writer.WriteLine("First line");

    }

using (TextWriter writer = File.AppendText(path)) // Check the file here
    {

        writer.WriteLine("First line");

    }