关于写文件并发时并发异常的问题?

jiezi316 2008-11-06 09:31:59
今天压力测试WEB服务,发现写错误日志的时候会出现该日志文件被另一进程使用而出现异常的问题
代码如下:


lock (this)
{
StreamWriter sw2 = File.AppendText("c:\\log.txt");
string errorMsg = "**{0}** 用户ID[{1}] 转换文件出错,错误信息:{2}";
sw2.WriteLine(string.Format(errorMsg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), userID, msg));
sw2.Close();
}


为来防止并发的问题,我还加了LOCK,但发现没有什么用,在压力测试的时候还是会出现文件被另一进程使用而出现异常的问题。
...全文
212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiezi316 2008-11-06
  • 打赏
  • 举报
回复

public class ConvertFile:System.Web.Services.WebService
{
static public StreamWriter sw = File.AppendText("c:\\log.txt");//定义公共静态变量

void WriteLog()
{
lock(ConvertFile.sw)
{
string errorMsg = "**{0}** 用户ID[{1}] 转换文件出错,错误信息:{2}";
sw.WriteLine(string.Format(errorMsg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), userID, msg));
sw.Flush();
sw.Close();
}
}
}

重写修改了下,大家看对不对?
jiezi316 2008-11-06
  • 打赏
  • 举报
回复
想了下应该不行,sw2 是局部的,lock(sw2)的有效范围也只在这个类中的sw2的范围有效,多个类的实例调用的话仍然会出错。
hywyjw 2008-11-06
  • 打赏
  • 举报
回复

try
{
}
catch
{
}
异常 处理不行吗? 有异常并发的就中止程序retrun; 不做处理 !
jiezi316 2008-11-06
  • 打赏
  • 举报
回复

StreamWriter sw2 = File.AppendText("c:\\fsc0.txt");
lock (sw2)
{

string errorMsg = "**{0}** 用户ID[{1}] 转换文件出错,错误信息:{2}";
sw2.WriteLine(string.Format(errorMsg, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), userID, msg));
sw2.Flush();
sw2.Close();
}


这样修改可以不?
jack20080808 2008-11-06
  • 打赏
  • 举报
回复
使用全局静态变量
jiezi316 2008-11-06
  • 打赏
  • 举报
回复
我倒,我以为lock(this)是使下面{}之间的代码互斥。
那我要互斥多个对象访问这个日志文件该怎么修改呢?
宝_爸 2008-11-06
  • 打赏
  • 举报
回复
对了,说明一下,lock(静态变量)本进程中,不会重入
IIS cpu garden设置为1意思是, IIS只用一个进程在整个Application pool中。
宝_爸 2008-11-06
  • 打赏
  • 举报
回复
lock (this)是这个对象中只有一个线程可以进入代码。
如果多个线程或进程调用初始化了这个对象,还是有很可能进入这段代码的。

可以lock一个静态变量,并且IIS的cpu garden设置为1。就没有问题了。
jiezi316 2008-11-06
  • 打赏
  • 举报
回复
难道是我关闭流前没有加下面这句话?
sw2.Flush();

110,571

社区成员

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

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

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