首页 新闻 赞助 找找看

多线程写日志 无法访问已关闭的文件

0
悬赏园豆:20 [待解决问题]

这是我写的写日志的类:
public static void WriteLog(string msg)
  {
  try
  {
  string log = LogPath + LogFielPrefix + "_" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
  if (!File.Exists(log))
  {
  StreamWriter CreateLog = File.CreateText(log);
  }

  //同一天同一类日志以追加形式保存
   
  sw = System.IO.File.AppendText(log);
  sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
  sw.Flush();
  }
  catch
  { 
   
  }
  finally
  {
  sw.Close();
  //sw.Close();
  }
  }
这是错误信息:
System.ObjectDisposedException: 无法访问已关闭的文件。
  在 System.IO.__Error.FileNotOpen()
  在 System.IO.FileStream.Flush()
  在 System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
  在 System.IO.StreamWriter.Dispose(Boolean disposing)
  在 System.IO.StreamWriter.Close()
  在 TJETCDataClient.LOG_OP.WriteLog(String msg) 位置 C:\Users\Administrator\Desktop\TJETCDataClient0916\LOG_OP.cs:行号 70
  在 TJETCDataClient.TJETCDataClient.Rcv_AllMsg() 位置 C:\Users\Administrator\Desktop\TJETCDataClient0916\TJETCDataClient.cs:行号 332
2010-10-08 11:17:16: 无法访问已关闭的文件。 
接收数据结束,线程返回

用户代码未处理 System.ObjectDisposedException
  Message="无法访问已关闭的文件。"
  Source="mscorlib"
  ObjectName=""
  StackTrace:
  在 System.IO.__Error.FileNotOpen()
  在 System.IO.FileStream.Flush()
  在 System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
  在 System.IO.StreamWriter.Dispose(Boolean disposing)
  在 System.IO.StreamWriter.Close()
  在 TJETCDataClient.LOG_OP.WriteLog(String msg) 位置 C:\Users\Administrator\Desktop\TJETCDataClient0916\LOG_OP.cs:行号 70
  在 TJETCDataClient.TJETCDataClient.Deal_SP(Object source, ElapsedEventArgs e) 位置 C:\Users\Administrator\Desktop\TJETCDataClient0916\TJETCDataClient.cs:行号 689
  在 System.Timers.ElapsedEventHandler.Invoke(Object sender, ElapsedEventArgs e)
  在 System.Timers.Timer.MyTimerCallback(Object state)
  InnerException: 
这是出错代码,都是调用的写日志的类:
 689行:LOG_OP.WriteLog(" 本次发送的记录条数是: " + count_record);
332行:LOG_OP.WriteLog(" 接收到新表:" + getTableName);

sunnyhaizi的主页 sunnyhaizi | 初学一级 | 园豆:80
提问于:2010-10-09 17:29
< >
分享
所有回答(1)
0

加锁了吗?

private static readonly object _lockLog = new object();

 


public static void WriteLog(string msg)
  {

 lock(_lockLog)

{
  try
  {
  string log = LogPath + LogFielPrefix + "_" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
  if (!File.Exists(log))
  {
  StreamWriter CreateLog = File.CreateText(log);
  }

  //同一天同一类日志以追加形式保存
   
  sw = System.IO.File.AppendText(log);
  sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
  sw.Flush();
  }
  catch
  { 
   
  }
  finally
  {
  sw.Close();
  //sw.Close();
  }

}
  }

 

 

还有啊,建议您用log4net组件。

具体使用方法等问题,请搜索博客园

影踪派 | 园豆:317 (菜鸟二级) | 2010-10-09 18:19
我加锁了,private static object _lockThis = new object();仍然不行,不过没加readonly,需要加么?
支持(0) 反对(0) sunnyhaizi | 园豆:80 (初学一级) | 2010-10-10 17:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册