C# .net 集合-并发处理之文件读写处理

//读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入
 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();
           }

       });



    }
发布了66 篇原创文章 · 获赞 30 · 访问量 28万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览