今天压力测试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,但发现没有什么用,在压力测试的时候还是会出现文件被另一进程使用而出现异常的问题。

解决方案 »

  1.   

    难道是我关闭流前没有加下面这句话?
    sw2.Flush();
      

  2.   

    lock (this)是这个对象中只有一个线程可以进入代码。
    如果多个线程或进程调用初始化了这个对象,还是有很可能进入这段代码的。可以lock一个静态变量,并且IIS的cpu garden设置为1。就没有问题了。
      

  3.   

    对了,说明一下,lock(静态变量)本进程中,不会重入
    IIS cpu garden设置为1意思是, IIS只用一个进程在整个Application pool中。
      

  4.   

    我倒,我以为lock(this)是使下面{}之间的代码互斥。
    那我要互斥多个对象访问这个日志文件该怎么修改呢?
      

  5.   


    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();
    }
    这样修改可以不?
      

  6.   


    try
    {
    }
    catch
    {
    }
    异常 处理不行吗?  有异常并发的就中止程序retrun; 不做处理 !
      

  7.   

    想了下应该不行,sw2 是局部的,lock(sw2)的有效范围也只在这个类中的sw2的范围有效,多个类的实例调用的话仍然会出错。
      

  8.   


    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();
             }
        }
    }重写修改了下,大家看对不对?