using语句后仍在使用的C#文件

using语句后仍在使用的C#文件,c#,C#,using语句之后,以下函数中的文件仍在使用中。如何修复此问题以释放文件 /// <summary> /// Serializes an object to an xml file. /// </summary> /// <param name="obj"> /// The object to serialize. /// </param> /// <param name="type">

using语句之后,以下函数中的文件仍在使用中。如何修复此问题以释放文件

/// <summary>
    /// Serializes an object to an xml file.
    /// </summary>
    /// <param name="obj">
    /// The object to serialize.
    /// </param>
    /// <param name="type">
    /// The class type of the object being passed.
    /// </param>
    /// <param name="fileName">
    /// The filename where the object should be saved to.
    /// </param>
    /// <param name="xsltPath">
    /// Pass a null if not required.
    /// </param>
    public static void SerializeToXmlFile(object obj, Type type, string fileName, string xsltPath )
    {
        var ns = new XmlSerializerNamespaces();
        ns.Add(String.Empty, String.Empty);
        var serializer = new XmlSerializer(type);

        var settings = new XmlWriterSettings {Indent = true, IndentChars = "\t"};


        using (var w = XmlWriter.Create(File.Create(fileName), settings))
        {

            if (!String.IsNullOrEmpty(xsltPath))
            {
                w.WriteProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\"");

            }
            serializer.Serialize(w, obj, ns);
        }
    }
//
///将对象序列化为xml文件。
/// 
/// 
///要序列化的对象。
/// 
/// 
///正在传递的对象的类类型。
/// 
/// 
///对象应保存到的文件名。
/// 
/// 
///如果不需要,则传递null。
/// 
公共静态无效文件(对象对象对象、类型、字符串文件名、字符串xsltPath)
{
var ns=新的XmlSerializerNamespaces();
ns.Add(String.Empty,String.Empty);
var serializer=新的XmlSerializer(类型);
var settings=newxmlwritersettings{Indent=true,IndentChars=“\t”};
使用(var w=XmlWriter.Create(File.Create(文件名),设置))
{
如果(!String.IsNullOrEmpty(xsltPath))
{
w、 WriteProcessingInstruction(“xml样式表”,“类型=\”文本/xsl\”href=\“”+xsltPath+“\”);
}
serializer.Serialize(w,obj,ns);
}
}

在using中只有XmlWriter作为对象,这仅仅是因为您调用了文件。从using中的代码创建并不意味着它将被释放

使用两个使用块:

using (FileStream f = File.Create(fileName)) {
   using (XmlWriter w = XmlWriter.Create(f, settings)) {
      ...
   }
}
那么:

using (var file = File.Create("fileName"))
{
    using (var w = XmlWriter.Create(file, settings))
    {
        if (!String.IsNullOrEmpty(xsltPath))
        {
            w.WriteProcessingInstruction(
                "xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\"");
        }
        serializer.Serialize(w, obj, ns);
    }
}

除了前面提到的附加“using”语句选项外,还有XmlWriterSettings.CloseOutput属性。我相信,如果您将其设置为true,它将实现您想要的功能。

有趣的属性。直到现在我才听说这件事。谢谢你,丹尼尔。这实际上是具体XmlWriter类实现中的一个bug。他们忘记实现Dispose()方法。显式使用Close()是另一种解决方法。@nobugz:这是一种误解。XmlWriter类实现IDisposable接口,因此具有Dispose方法。它是显式实现的,因此必须使用IDisposable引用来访问Dispose方法。在Using块中使用XmlWriter将正确地处理它,dispose方法调用Close方法。