0

FileStream.BeginWrite() メソッドを使用して xml ファイルを書き込もうとしていますが、Can't Access the Close Fileエラーが発生します。

私のコードは

public void WriteXmlLog(string logType, string logFlag, string logModule, string logLocation, string logText, string logStackTrace)
{
    if (!File.Exists(_logFilePath))
    {
        File.WriteAllText(_logFilePath, "<?xml version='1.0' encoding='utf-8' standalone='yes'?>\r\n<AppXmlLogWritter></AppXmlLogWritter>");
    }

    XmlDocument xmlDoc = new XmlDocument();

    using (fileStream = new FileStream(_logFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
        xmlDoc.Load(fileStream);
        XmlElement newelement = xmlDoc.CreateElement("LogData");
        XmlElement xmlLogID = xmlDoc.CreateElement("LogID");
        XmlElement xmlLogDateTime = xmlDoc.CreateElement("LogDateTime");
        XmlElement xmlLogType = xmlDoc.CreateElement("LogType");
        XmlElement xmlLogFlag = xmlDoc.CreateElement("LogFlag");
        XmlElement xmlLogApplication = xmlDoc.CreateElement("LogApplication");
        XmlElement xmlLogModule = xmlDoc.CreateElement("LogModule");
        XmlElement xmlLogLocation = xmlDoc.CreateElement("LogLocation");
        XmlElement xmlLogText = xmlDoc.CreateElement("LogText");
        XmlElement xmlLogStackTrace = xmlDoc.CreateElement("LogStackTrace");

        xmlLogID.InnerText = _logIDPrefix + currentDateTime + randomNumber;
        xmlLogDateTime.InnerText = currentDateTime;
        xmlLogType.InnerText = ((LogTypes)Convert.ToInt32(logType)).ToString();
        xmlLogFlag.InnerText = logFlag;
        xmlLogApplication.InnerText = _logApplication;
        xmlLogModule.InnerText = logModule;
        xmlLogLocation.InnerText = logLocation;
        xmlLogText.InnerText = logText;
        xmlLogStackTrace.InnerText = logStackTrace;

        newelement.AppendChild(xmlLogID);
        newelement.AppendChild(xmlLogDateTime);
        newelement.AppendChild(xmlLogType);
        newelement.AppendChild(xmlLogFlag);
        newelement.AppendChild(xmlLogApplication);
        newelement.AppendChild(xmlLogModule);
        newelement.AppendChild(xmlLogLocation);
        newelement.AppendChild(xmlLogText);

        xmlDoc.DocumentElement.AppendChild(newelement);
        Byte[] myByteArray = Encoding.UTF8.GetBytes(newelement.ToString());
        fileStream.BeginWrite(myByteArray, 0, myByteArray.Length, WriteAsyncCallback, new LogWritter(myByteArray, fileStream));
    }

    xmlDoc.Save(_logFilePath);
}

public Stream MyStream { get; set; }

private void WriteAsyncCallback(IAsyncResult ar)
{
    LogWritter info = ar.AsyncState as LogWritter;
    info.MyStream.EndWrite(ar);
}

WriteAsyncCallback(IAsyncResult ar)関数で上記のエラーが発生します。

4

2 に答える 2

2

ステートメントでストリームを開いていusing()ますが、そのステートメントで最後に行うことは、非同期書き込みを発行することです。非同期書き込みを発行するとすぐに、using ステートメントが終了し、おそらく非同期書き込みが発生する前にファイルが閉じます。ここで非同期書き込みを行わないでください。ファイルを開いたままにし、非同期書き込みが完了した後にファイルを閉じるハンドラーがない限り、何も得られません。

于 2013-01-16T13:50:10.927 に答える
1

次の行でバックグラウンド スレッドを開始することにより、using ステートメントを範囲外にします。

fileStream.BeginWrite(myByteArray, 0, myByteArray.Length, WriteAsyncCallback, new LogWritter(myByteArray, fileStream));

この関数をスレッド セーフにしたい場合は、Thread が WriteXmlLog メソッドをロックすることを検討してください。

于 2013-01-16T14:56:30.503 に答える