2015-06-22 20 views
2

在我的WPF应用程序代码中,我得到以下警告:WPF码分析:CA2202不处置的对象多timesObject

CA2202不处置对象多次对象“FS”可以 在位于不止一次方法 'MainWindow.TestResults_Click(object,RoutedEventArgs)'。为避免 生成System.ObjectDisposedException,您不应该调用 在对象上放置多次。 :行: 429 yesMonitor MainWindow.xaml.cs 429

代码:

FileStream fs = new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "TestResult.htm", FileMode.Create); 
using (fs) 
{ 
    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8)) 
    { 
     w.WriteLine(GetTestResultsHtml()); 
    } 
} 

应该是什么这些警告的原因是什么?

+0

相关http://stackoverflow.com/questions/11192445/disposing-of-object-multiple-times –

+0

http://stackoverflow.com/questions/3831676/ca2202-如何解决这种情况为您的问题的前半部分提供了答案 –

回答

2

使用语句进行嵌套可能会导致违反CA2202警告。如果嵌套的内部使用语句的IDisposable资源包含外部使用语句的资源,则嵌套资源的Dispose方法将释放所包含的资源。发生这种情况时,外部使用语句的Dispose方法会尝试第二次处理其资源。 在以下示例中,在包含流对象的StreamWriter对象的Dispose方法的内部using语句的末尾释放在外部using语句中创建的Stream对象。在外部使用语句的末尾,流对象被第二次释放。第二次发布违反了CA2202。

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate)) 
{ 
    using (StreamWriter writer = new StreamWriter(stream)) 
    { 
     // Use the writer object... 
    } 
} 

要解决此问题,请使用try/finally块而不是外部using语句。在finally块中,确保流资源不为空。

Stream stream = null; 
try 
{ 
    stream = new FileStream("file.txt", FileMode.OpenOrCreate); 
    using (StreamWriter writer = new StreamWriter(stream)) 
    { 
     stream = null; 
     // Use the writer object... 
    } 
} 
finally 
{ 
    if(stream != null) 
     stream.Dispose(); 
} 
0

个人在这种情况下,我会用:

public StreamWriter(
    string path, 
    bool append 
) 

使用默认编码和缓冲区大小初始化为指定 文件StreamWriter类的新实例。如果文件 存在,它可以被覆盖或附加到。如果文件 不存在,则此构造函数将创建一个新文件。

但目前还没有很好的解决办法,请参阅CA2202, how to solve this case