代码如下,请各位大哥指点!
private static object m_ctx = new object();private static void F_Write(string _info)
{
try
{
lock(m_ctx)
{
if(!Directory.Exists("log"))
{
Directory.CreateDirectory("log");
}

FileInfo _fileInfo = new FileInfo(P_FileName);

//如果所指定的文件名不存在,则以些文件名新建一个日志文件。
if (!_fileInfo.Exists) 
{
//创建一个日志文件用于记录。
using (StreamWriter _streamWriter = _fileInfo.CreateText()) 
{
_streamWriter.WriteLine(DateTime.Now.ToString() + " " +"成功创建日志!");
}            
}


//写入日志信息。
using (StreamWriter _streamWriter = _fileInfo.AppendText()) 
{

_streamWriter.WriteLine(_info);
}
}
}
catch(Exception ex)
{
MessageBox.Show("写入日志失败! At EventLog.F_Write()\n" + ex.ToString());
}
}
异常经常出在using (StreamWriter _streamWriter = _fileInfo.AppendText()) 这句。

解决方案 »

  1.   

    不好意思,乱七八糟的,整理了一下
    异常经常出在using (StreamWriter _streamWriter = _fileInfo.AppendText()) 这句。private static object m_ctx = new object();private static void F_Write(string _info)
        {
            try
            {
                lock(m_ctx)
       {
           if(!Directory.Exists("log"))
           {
               Directory.CreateDirectory("log");
           }

                    FileInfo _fileInfo = new FileInfo(P_FileName);

    //如果所指定的文件名不存在,则以些文件名新建一个日志文件。
           if (!_fileInfo.Exists) 
           {
    //创建一个日志文件用于记录。
      using (StreamWriter _streamWriter = _fileInfo.CreateText()) 
      {
          _streamWriter.WriteLine(DateTime.Now.ToString() + " " +"成功创建日志!");
       }            
           }


    //写入日志信息。
           using (StreamWriter _streamWriter = _fileInfo.AppendText()) 
           {
               _streamWriter.WriteLine(_info);
           }
    }
        }
        catch(Exception ex)
        {
    MessageBox.Show("写入日志失败! At EventLog.F_Write()\n" + ex.ToString());
        }
    }
      

  2.   

    可是我有用 using 语句啊,应该会自动释放才对啊,同时我也有用 lock()语句将程序块锁住啊,别的线程应该不会同时来访问才对啊!
      

  3.   

    试试看filestream来写filestream fs=_fileInfo.OpenWrite()
      

  4.   

    我试试了单线程没有问题!觉得楼主使用了互斥体(lock(m_ctx))
    猜想楼主可能使用了多线程
    应该线程没有管理好,或者调试的时候有线程没有结束想试出楼主的多线程的错误,可是没有成功 -_-"~~还有建议:
    对于这样try,catch
    在最后最好使用finally做后处理
    比如writer,connect的关闭放在这里
    也可以楼主用了using (StreamWriter _streamWriter = _fileInfo.AppendText()
    但是两者在抛出异常时有没有差异?我不知道
    觉得finally好一些:)
      

  5.   

    谢谢 小鬼的建议,我加个finally块试看看。
    不知道其它大哥有什么好建议没有?
      

  6.   

    其实我的程序是连续运行了好几天后才出现这样的情况,原先在测试的时候也频繁发生这种情况,后来我加了线程互斥,这种情况几乎没有再发生过,直到程序release后运行了好几天才出现,实在是晕。、
      

  7.   

    严重同意你的线程互斥我也觉得不应该出什么错.
    我试了半天都没有试出来...
    只有出现想不到的异常,而且估计要看机遇....
    随机,看看楼主的运气如何了
    捕捉异常的能力怎么样了...:P想想,不是你程序的错误
    可能同一个运行了多个你的程序
    (或者你的其他程序正在访问你的错误日志文件)
    互斥体在多个AppDomain中不能起作用的
      

  8.   

    没什么太大的问题,可能是进程不同步造成的
    我的解决意见是
    private static void F_Write(string _info)
    {
    try
    {
    if(!Directory.Exists("log"))
    {
    Directory.CreateDirectory("log");
    } FileInfo _fileInfo = new FileInfo(P_FileName);
    string strTemp="";
    //如果所指定的文件名不存在,则以些文件名新建一个日志文件。
    if (!_fileInfo.Exists) 
    {
    strTemp=DateTime.Now.ToString() + " " +"成功创建日志!";         
    }
    _fileInfo.AppendText().Close();
    //写入日志信息。
    using (StreamWriter _streamWriter = _fileInfo.AppendText()) 
    {
    if(strTemp!="")
    _streamWriter.WriteLine(strTemp);
    _streamWriter.WriteLine(_info);
    }
    }
    catch(Exception ex)
    {
    MessageBox.Show("写入日志失败! At EventLog.F_Write()\n" + ex.ToString());
    }
    }
      

  9.   

    _fileInfo.AppendText().Close();//这句是废话 不要
      

  10.   

    由于我是每天自动生成一个新的日志文件,文件名规则是按时间和启动程序实例的参数组成,所以 _fileInfo.CreateText() 这句还是需要的,如果不存在此文件,则创建一个。
      

  11.   

    AppendText()这个方法有创建文件的功能,
    请尝试我给出的代码,有问题请回复我
      

  12.   

    to: cancerser(都是混饭吃,记得要结帖) 
     我已经把代码改成你给的那段,可以生成日志,不过要运行几天瞧瞧,但愿删掉上面那句后可以一切正常。谢谢。
      

  13.   

    试用下Mutex: public static Mutex mtx = new Mutex();
            private static void F_Write(string _info)
            {
                mtx.WaitOne();
                try
                {
                    if (!Directory.Exists("log"))
                    {
                        Directory.CreateDirectory("log");
                    }                FileInfo _fileInfo = new FileInfo(P_FileName);                //如果所指定的文件名不存在,则以些文件名新建一个日志文件。
                    if (!_fileInfo.Exists)
                    {
                        //创建一个日志文件用于记录。
                        using (StreamWriter _streamWriter = _fileInfo.CreateText())
                        {
                            _streamWriter.WriteLine(DateTime.Now.ToString() + " " + "成功创建日志!");
                        }
                    }                //写入日志信息。
                    using (StreamWriter _streamWriter = _fileInfo.AppendText())
                    {
                        _streamWriter.WriteLine(_info);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("写入日志失败! At EventLog.F_Write()\n" + ex.ToString());
                }
                mtx.ReleaseMutex();
            }
      

  14.   

    如果还是有问题,那就别用using,用完一个释放一个..如下: public static Mutex mtx = new Mutex();
            private static void F_Write(string _info)
            {
                mtx.WaitOne();
                try
                {
                    if (!Directory.Exists("log"))
                    {
                        Directory.CreateDirectory("log");
                    }                FileInfo _fileInfo = new FileInfo(P_FileName);                //如果所指定的文件名不存在,则以些文件名新建一个日志文件。
                    if (!_fileInfo.Exists)
                    {
                        //创建一个日志文件用于记录。
                        using (StreamWriter _streamWriter = _fileInfo.CreateText())
                        {
                            _streamWriter.WriteLine(DateTime.Now.ToString() + " " + "成功创建日志!");
                        }
                    }                //写入日志信息。
                    using (StreamWriter _streamWriter = _fileInfo.AppendText())
                    {
                        _streamWriter.WriteLine(_info);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("写入日志失败! At EventLog.F_Write()\n" + ex.ToString());
                }
                mtx.ReleaseMutex();
            }
      

  15.   

    好的,谢谢,我用Mutex试下先
      

  16.   

    这样吧,你把using去掉试试,自己手动关闭