今天压力测试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,但发现没有什么用,在压力测试的时候还是会出现文件被另一进程使用而出现异常的问题。
代码如下:
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,但发现没有什么用,在压力测试的时候还是会出现文件被另一进程使用而出现异常的问题。
sw2.Flush();
如果多个线程或进程调用初始化了这个对象,还是有很可能进入这段代码的。可以lock一个静态变量,并且IIS的cpu garden设置为1。就没有问题了。
IIS cpu garden设置为1意思是, IIS只用一个进程在整个Application pool中。
那我要互斥多个对象访问这个日志文件该怎么修改呢?
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();
}
这样修改可以不?
try
{
}
catch
{
}
异常 处理不行吗? 有异常并发的就中止程序retrun; 不做处理 !
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();
}
}
}重写修改了下,大家看对不对?