//读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入
static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();
//设置读写锁为写入模式独占资源,其他写入请求需要等待本次写入结束之后才能继续写入
//注意:长时间持有读线程锁或写线程锁会使其他线程发生饥饿 (starve)。 为了得到最好的性能,需要考虑重新构造应用程序以将写访问的持续时间减少到最小。
// 从性能方面考虑,请求进入写入模式应该紧跟文件操作之前,在此处进入写入模式仅是为了降低代码复杂度
// 因进入与退出写入模式应在同一个try finally语句块内,所以在请求进入写入模式之前不能触发异常,否则释放次数大于请求次数将会触发异常
LogWriteLock.EnterWriteLock();
static ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();
//写log文件
public void WriteLog()
{
string SDate = Program.SpiderDate;
//创建文件夹
string Path = “Log\” + SDate;
if (!Directory.Exists(Path))
{
Directory.CreateDirectory(Path);
}
string logName = “Log\” + SDate + “\” + SDate + “.txt”;
int len = 0;
Parallel.ForEach<LogEntity>(Program.LogList.GetConsumingEnumerable(), logEntity =>
//foreach (LogEntity logEntity in Program.LogList.GetConsumingEnumerable())
{
try
{
LogWriteLock.EnterWriteLock();
using (StreamWriter sw = new StreamWriter(logName, true, Encoding.Default))
{
sw.WriteLine(logEntity.STime);
sw.WriteLine(logEntity.Content);
}
}
catch (FileNotFoundException fileCe)
{
throw fileCe;
}
catch (Exception ce)
{
throw ce;
}
finally
{
//退出写入模式,释放资源占用
LogWriteLock.ExitWriteLock();
}
});
}