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

sunny_haizi 2010-10-08 12:17:16
这是我写的写日志的类:
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);
...全文
444 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny_haizi 2010-10-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zenghd 的回复:]

放出完整代码
[/Quote]
完整的代码太长了额,今天把多线程去掉了,直接一个线程,没啥问题了。谢谢啊!
fangxiaofelix 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jaydawson 的回复:]
引用 4 楼 gouhan02 的回复:

多线程写日志一定要注意共享资源。一定要lock


楼上正解,在对临界资源进行操作时,务必要加Lock机制哦。
[/Quote]
来晚一步了
sunny_haizi 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hujinn 的回复:]

多线程加入lock机制
C# code

private object lockTemp=New object();
public static void WriteLog(string msg)
{
lock(lockTemp)
{
StreamWriter sw = null;
……
[/Quote]
谢谢啊,我就是想加个锁,改过来了,还没测试呢!
sunny_haizi 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jaydawson 的回复:]

引用 4 楼 gouhan02 的回复:

多线程写日志一定要注意共享资源。一定要lock


楼上正解,在对临界资源进行操作时,务必要加Lock机制哦。
[/Quote]
嗯 现在知道了,谢谢啊
sunny_haizi 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yujingyang 的回复:]

if (!File.Exists(log))
{
StreamWriter CreateLog = File.CreateText(log);
}

//同一天同一类日志以追加形式保存
----> 什么意思?
sw = System.IO.File.AppendText(log); --------> 没有实例化
sw.WriteLine(D……
[/Quote]
第一次运行的时候是没有实例化,怎么解决这个问题呢?
ZengHD 2010-10-09
  • 打赏
  • 举报
回复
放出完整代码
sunny_haizi 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hujinn 的回复:]

多线程加入lock机制
C# code

private object lockTemp=New object();
public static void WriteLog(string msg)
{
lock(lockTemp)
{
StreamWriter sw = null;
……
[/Quote]
改过来之后还是出现相同的错误!

hujinn 2010-10-08
  • 打赏
  • 举报
回复
上面括号打错地方了!楼主应该懂的!!!
hujinn 2010-10-08
  • 打赏
  • 举报
回复
多线程加入lock机制

private object lockTemp=New object();
public static void WriteLog(string msg)
{
lock(lockTemp)
{
StreamWriter sw = null;
string log = "c:\\log.txt";
try
{
sw = System.IO.File.AppendText(log);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
sw.Flush();
}
}
catch
{

}
finally
{
sw.Close();
}
}

jaydawson 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gouhan02 的回复:]

多线程写日志一定要注意共享资源。一定要lock
[/Quote]

楼上正解,在对临界资源进行操作时,务必要加Lock机制哦。
wuyq11 2010-10-08
  • 打赏
  • 举报
回复
using(StreamWriter sw= System.IO.File.AppendText(log))
{}
线程操作
File.AppendAllText 方法 (String, String)
gouhan02 2010-10-08
  • 打赏
  • 举报
回复
多线程写日志一定要注意共享资源。一定要lock
yujingyang 2010-10-08
  • 打赏
  • 举报
回复
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();
ZengHD 2010-10-08
  • 打赏
  • 举报
回复
        
你的多线程代码呢??
public static void WriteLog(string msg)
{
StreamWriter sw = null;
string log = "c:\\log.txt";
try
{
sw = System.IO.File.AppendText(log);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
sw.Flush();
}
catch
{

}
finally
{
sw.Close();
}
}

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧