我有个控制台程序,引用Log4Net。
调用自己类的Info方法来调用Log4Net的info,写日志信息。然后写了一个多线程程序。
想说让两个线程同时处理同一个log文件,
而且我log4net配置是20KB分文件。
单独跑log程序是没问题的。
可在多线程里跑,最后的日志文件丢失了一部分数据。
谁能帮我看看?
谢谢下边是线程代码。
有需要,可以把Log的也贴上来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections;
using System.Diagnostics;
namespace Thread_test
{
    public class ThreadDemo
    {
        private Thread threadOne;
        private Thread threadTwo;
        private ArrayList stringList;
        private event EventHandler OnNumberClear;//数据删除完成引发的事件        static void Main(string[] args)
        {
            ThreadDemo demo = new ThreadDemo(10);
            demo.Action();
        }        public ThreadDemo(int number)
        {
            stringList = new ArrayList(number);
            for (int i = 0; i < number; i++)
            {
                stringList.Add(" log" + i);
            }
            threadOne = new Thread(new ThreadStart(Run));//两个线程共同执行exe
            threadTwo = new Thread(new ThreadStart(Run));
            threadOne.Name = "线程1";
            threadTwo.Name = "线程2";
            OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
        }
        /// <summary>
        /// 开始工作
        /// </summary>
        public void Action()
        {
            threadOne.Start();
            threadTwo.Start();
        }
        /// <summary>
        /// 共同做的工作
        /// </summary>
        private void Run()
        {
            string stringValue = null;
            while (true)
            {
                //Monitor.Enter(this);//锁定,保持同步
                stringValue = (string)stringList[0];
                Console.WriteLine(Thread.CurrentThread.Name + "执行了" + stringValue);
                Process proc = new Process();
                proc.StartInfo.FileName = @"E:\asp\log_test\log_test\bin\Release\log_test.exe";//log程序
                proc.StartInfo.Arguments = stringList[0].ToString();//Log程序的参数
                proc.Start();
                stringList.RemoveAt(0);//删除ArrayList中的元素
                Console.WriteLine(stringList.Count);
                if (stringList.Count == 0)
                {
                    OnNumberClear(this, new EventArgs());//引发完成事件
                }
                //Monitor.Exit(this);//取消锁定
                //Thread.Sleep(5);
            }
        }        //执行完成之后,停止所有线程
        void ThreadDemo_OnNumberClear(object sender, EventArgs e)
        {
            Console.WriteLine("执行完了,停止了所有线程的执行。");
            threadTwo.Abort();
            threadOne.Abort();
        }
    }
}

解决方案 »

  1.   

    http://www.cnblogs.com/anderslly/archive/2007/03/09/log4netconfigsamples.html
    搜索 lockingModel 
      

  2.   

    线程 共同访问 资源 记得 lock
      

  3.   

    直接配置log4net的Appender,不用后台开线程。
    使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件
      

  4.   

    创建一个写入队列。启动一个线程,当队列有数据就依次取数据写日志。不存在并发。
    可以用带有消息机制的PostMessage方式。每次处理消息即可。消息是排队的,不会并发。
    多线程读写数据根本不需要多线程读写文件
      

  5.   

    问题解决,
    我用Mutex控制Log.info()就好了。
    不过这样的话,如果我这样using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Collections;
    using System.Diagnostics;
    namespace Thread_test
    {
        public class ThreadDemo
        {
            private Process[] proc = new Process[100];
            private ArrayList stringList;        static void Main(string[] args)
            {
                ThreadDemo demo = new ThreadDemo(100);
            }        public ThreadDemo(int number)
            {
                stringList = new ArrayList(number);
                for (int i = 0; i < number; i++)
                {
                    proc[i] = new Process();
                    proc[i].StartInfo.FileName = @"E:\asp\log_test\log_test\bin\Release\log_test.exe";
                    stringList.Add(" log" + i);
                    proc[i].StartInfo.Arguments = stringList[i].ToString();
                }
                for (int i = 0; i < number; i++)
                {
                    proc[i].Start();    
                }
                
            }
        }
    }直接跑100个.exe文件,观察内存的消耗,还是满大的。
    100个大概消耗了500MB内存。是不是不太理想的处理办法?
    我是不是应该试下队列呢?
      

  6.   

    直接配置log4net的Appender,不用后台开线程。
    使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件
      

  7.   

    我做过最小锁定,如果我很多个程序并行处理,会丢失Log数据的。