我有个控制台程序,引用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();
}
}
}
调用自己类的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();
}
}
}
搜索 lockingModel
使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件
可以用带有消息机制的PostMessage方式。每次处理消息即可。消息是排队的,不会并发。
多线程读写数据根本不需要多线程读写文件
我用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内存。是不是不太理想的处理办法?
我是不是应该试下队列呢?
使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件