我的代码如下:
该代码作为web服务的一部分代码,为什么mutex起不到作用,经常出现同时获取到互斥体造成程序无法运行的问题,请高手解答!
代码:
public class WriteLog
{
private static System.Threading.Mutex CASLogmutex = new System.Threading.Mutex(false,"CASLogmutexName"); public WriteLog()
{
}  
   
public static void WriteCASLog(string message)
{   
string file=Global.ServerFilePath+"LogFile\\CAS\\"+DateTime.Now.ToShortDateString()+".txt";
string message1=DateTime.Now.ToString()+" : "+message+"\r\n";
            
CASLogmutex.WaitOne();
            WriteLog.WriteMessageToText(file,message1);
            CASLogmutex.ReleaseMutex();
} public static void WriteCASLogAndThrowException(string message)
{   
string file=Global.ServerFilePath+"LogFile\\CAS\\"+DateTime.Now.ToShortDateString()+".txt";
string message1=DateTime.Now.ToString()+" : "+message+"\r\n";
            
CASLogmutex.WaitOne();
WriteLog.WriteMessageToText(file,message1);
            CASLogmutex.ReleaseMutex(); throw new Exception("CAS管理器返回异常:"+message);
}

}该代码是想实现对日志文件的互斥访问写入,当mutex起不了作用 还是经常出现同时访问同一个日志文件的情况,造成程序异常

解决方案 »

  1.   

    应该不会,我在webservice中写过类似的代码,运行好好的
      

  2.   

    [STAThread]
    static void Main()
    {
    Application.Run(new Form1());
    }
    // 定义私有变量。
    public static Mutex m;
    public Thread a;
    public Thread b;
    // 线程A。
    public void ThreadA()
    {
    while(true)
    {
    Form1.m.WaitOne();
    richTextBox1.Text += "A";
    Form1.m.ReleaseMutex();
    Thread.Sleep(10);
    }
    }
    // 线程B。
    public void ThreadB()
    {
    while(true)
    {
    Form1.m.WaitOne();
    richTextBox1.Text += "B";
    Form1.m.ReleaseMutex();
    Thread.Sleep(30);
    }
    }
    // 开始多线程。
    private void button1_Click(object sender, System.EventArgs e)
    {
    m = new Mutex();
    a = new Thread(new ThreadStart(this.ThreadA));
    b = new Thread(new ThreadStart(this.ThreadB));
    a.Start();
    b.Start();
    button1.Enabled = false;
    }
    // 结束多线程。
    private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    a.Abort();
    b.Abort();
    }
      

  3.   

    Knight94(愚翁) ( ) 信誉:110  2006-07-12 14:01:00  得分: 0  
     
     
       应该不会,我在webservice中写过类似的代码,运行好好的
      
     实际上就会了  不过我定义了不只一个mutex
      

  4.   

    to 实际上就会了 不过我定义了不只一个mutex你不是定义为static了吗
      

  5.   

    你不是定义为static了吗我的意思是这样:
    private static System.Threading.Mutex CASLogmutex = new System.Threading.Mutex(false,"CASLogmutexName");
    private static System.Threading.Mutex CASLogmutex2 = new System.Threading.Mutex(false,"CASLogmutexName2");
      

  6.   

    这样定义了多个mutex  这些mutex在程序的不同地方使用想实现对不同资源的互斥访问
      

  7.   

    to 这样定义了多个mutex  这些mutex在程序的不同地方使用想实现对不同资源的互斥访问名字完全一样?
      

  8.   

    是否不同的mutex 就必须有不同的名称? 
        多个类里定义: static Mutex m_Mutex = new Mutex() 会有什么问题?
      

  9.   

    名字一样的就会互斥
    名字不一样的就是另外一个互斥体,没有关系。
    private static System.Threading.Mutex CASLogmutex1 = new System.Threading.Mutex(false,"CASLogmutexName");
    private static System.Threading.Mutex CASLogmutex2 = new System.Threading.Mutex(false,"CASLogmutexName");
    private static System.Threading.Mutex CASLogmutex3 = new System.Threading.Mutex(false,"CASLogmutexName3");CASLogmutex1和CASLogmutex2会互斥,CASLogmutex1和CASLogmutex3完全没有任何关系。
      

  10.   

    基本上懂明白你的代码意思了,你的用法似乎不对,这里用lock就行了:
    lock (typeof(WriteLog))
    {
        WriteLog.WriteMessageToText(file,message1);
    }互斥体对象针对同一个互斥体互斥,但你一直是用的同一个互斥体对象,这种做法本身就有问题。(不过我没试过!只觉得思路有问题。)
      

  11.   

    用lock肯定是不行的 我的是要实现2处代码用同一个资源 就是多个地方多个代码块对同一个文件写入  而不是写入的只有一个代码块
      

  12.   

    按  mutex的例子我的应该是可以的 但现在不行  请各位再看看  究竟是什么地方出错了
      

  13.   

    "用lock肯定是不行的"
    ------------------------------------------------------------
    你晓得个狗屁!随便乱否定别人的!试了再说lock不行好不好?mutex的优势是命名mutex可以进程同步(当然要以性能作代价),lock只能在进程内做到线程同步。谁说lock只能对一处代码同步?你这种情况完全是lock就可以解决的,你还瞧不起lock是不是?mutex在这里除了性能差点没什么别的不同!
      

  14.   

    "按  mutex的例子我的应该是可以的 但现在不行  请各位再看看  究竟是什么地方出错了"
    ---------------------------------------------------------
    "应该"如果有用,那么CSDN的技术论坛就没有用了!
      

  15.   

    第一步 删除 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
    目录下相关的虚拟目录的临时文件
    第二步 重启IIS 在dos 输入 iisreset第三步 在IE 输入虚拟目录的地址,访问虚拟目录第四步 打开项目,应该可以用啦。。
      

  16.   

    第一步 删除 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
    目录下相关的虚拟目录的临时文件
    第二步 重启IIS 在dos 输入 iisreset第三步 在IE 输入虚拟目录的地址,访问虚拟目录第四步 打开项目,应该可以用啦。。
    难道必须要删除临时文件才有用
      

  17.   

    "按  mutex的例子我的应该是可以的 但现在不行  请各位再看看  究竟是什么地方出错了"
    ---------------------------------------------------------
    "应该"如果有用,那么CSDN的技术论坛就没有用了!
    火气太旺了点嘛  我现在就是想弄明白mutex为什么不行
      

  18.   

    //这句删除:private static System.Threading.Mutex CASLogmutex = new System.Threading.Mutex(false,"CASLogmutexName");public class WriteLog
    {
    public WriteLog()
    {
    }  
       
    public static void WriteCASLog(string message)
    {   
    string file=Global.ServerFilePath+"LogFile\\CAS\\"+DateTime.Now.ToShortDateString()+".txt";
    string message1=DateTime.Now.ToString()+" : "+message+"\r\n";
    System.Threading.Mutex CASLogmutex = new System.Threading.Mutex(false,"CASLogmutexName");
    CASLogmutex.WaitOne();
                WriteLog.WriteMessageToText(file,message1);
                CASLogmutex.ReleaseMutex();
    }public static void WriteCASLogAndThrowException(string message)
    {   
    string file=Global.ServerFilePath+"LogFile\\CAS\\"+DateTime.Now.ToShortDateString()+".txt";
    string message1=DateTime.Now.ToString()+" : "+message+"\r\n";
    System.Threading.Mutex CASLogmutex = new System.Threading.Mutex(false,"CASLogmutexName");
    CASLogmutex.WaitOne();
    WriteLog.WriteMessageToText(file,message1);
                CASLogmutex.ReleaseMutex();throw new Exception("CAS管理器返回异常:"+message);
    }
    }
      

  19.   

    www_123du_com(www.123du.com)请问为什么要删除  为什么那样不行
      

  20.   

    互斥体对象针对同一个互斥体互斥,但你一直是用的同一个互斥体对象。(这里,互斥体指windows提供的互斥体。互斥体对象指.NET的对象)你应该是用一个互斥体,多个对象来达到互斥效果。
      

  21.   

    没看明白互斥体对象针对同一个互斥体互斥,但你一直是用的同一个互斥体对象。(这里,互斥体指windows提供的互斥体。互斥体对象指.NET的对象)你应该是用一个互斥体,多个对象来达到互斥效果。一个 mutex对象表示什么  一个互斥体那多个对象来达到互斥效果。
      是什么意思
      

  22.   

    可以参考这里mutex的用法,
    http://blog.csdn.net/zhzuo/archive/2006/06/30/857405.aspx#sec3
    你这里应该是WebService中的多个线程中使用mutex.