异常问题记录:

本想自己手动实现一个日志记录功能。使用Queue队列集合来实现多线程的日志记录。

测试 一个线程写入数据Enqueue和一个线程读取数据Dequeue ,直接用的无休眠死循环。

终于抛出异常:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。

于是百度之。百度结果 说是多线程写入数据 需要锁定操作lock。

尝试后无效果   依然报异常。

最后解决办法  是 在 Queue 读和 都加上锁定。测试N多线程同时写入和读错都能正常。

LogModel类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI; namespace Common.Helper.LogHelper
{
/// <summary>
/// 日志模型
/// </summary>
public class LogModel
{
/// <summary>
/// 日志要存的路径 默认路径:网站根目录 + Log 文件夹
/// </summary>
public string logFilePath = HttpContext.Current.Server.MapPath("~/") + @"\Log\"; private string _logFileName; /// <summary>
/// 日志文件名字
/// </summary>
public string logFileName
{
get { return _logFileName + "_" + DateTime.Now.ToString("yyyyMMdd"); }
set { _logFileName = value; }
} private string _logMessg; /// <summary>
/// 日志内容
/// </summary>
public string logMessg
{
get
{
return "====begin====================" + DateTime.Now.ToString() + "====Queue.Count:" + LogHelper.LogQueue.Count + "====================\r\n\r\n"
+ _logMessg
+ "\r\n\r\n====end====================" + DateTime.Now.ToString() + "====Queue.Count:" + LogHelper.LogQueue.Count + "===================="
+ "\r\n\r\n\r\n";
}
set { _logMessg = value; }
}
}
}

LogHelper类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Common.Helper.LogHelper
{
/// <summary>
/// 日志操作辅助类
/// zhaopeiym@163.com
/// 创建20150104 修改20150104
/// </summary>
public class LogHelper
{
/// <summary>
/// 消息队列
/// </summary>
private static Queue<LogModel> logQueue = new Queue<LogModel>();
/// <summary>
/// 消息队列 对外只读
/// </summary>
public static Queue<LogModel> LogQueue
{
get { return LogHelper.logQueue; }
} /// <summary>
/// 标志锁
/// </summary>
static string myLock = "true"; /// <summary>
/// 写入日志文件
/// </summary>
/// <param name="logmede"></param>
public static void logWrite(LogModel logmede)
{
// 这里需要锁上 不然会出现:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。异常
//网上有资料说 http://blog.csdn.net/greatbody/article/details/26135057 不能多线程同时写入队列
//其实 不仅仅 不能同时写入队列 也不能同时读和写如队列 所以 在Dequeue 取的时候也要锁定一个对象
lock (myLock)
logQueue.Enqueue(logmede);
logStartWrite();
} /// <summary>
/// 部分日志文件大小
/// </summary>
public static int SectionlogFileSize = * * ; // 1024Byte * 1024KB * 1MB /// <summary>
/// 变动文件大小
/// </summary>
public static int fileSize = * * ; /// <summary>
/// 文件编码格式
/// </summary>
public static Encoding encoding = Encoding.Default; /// <summary>
/// 是否开始自动记录日志
/// </summary>
private static bool isStart = false; /// <summary>
/// 开始把队列消息写入文件
/// </summary>
private static void logStartWrite()
{
if (isStart)
return;
isStart = true;
Thread t = new Thread(delegate()
{
while (true)
{
if (LogHelper.logQueue.Count >= )
{
LogModel m = null;
lock (myLock)
m = LogHelper.logQueue.Dequeue();
if (m == null)
continue;
if (!Directory.Exists(m.logFilePath))
Directory.CreateDirectory(m.logFilePath); int i = ;
//部分 日志 文件路径
string SectionfileFullName = m.logFilePath + m.logFileName + "_" + i.ToString("") + ".txt";
//最新的写了内容的 部分 日志文件路径
string TopSectionfileFullName = SectionfileFullName;
// 需要实时更新的 最新日志文件 路径
string LogfileFullNqme = m.logFilePath + m.logFileName + ".txt"; FileInfo file = new FileInfo(SectionfileFullName);
while (file.Exists && file.Length >= LogHelper.SectionlogFileSize)
{
TopSectionfileFullName = SectionfileFullName;
i++;
SectionfileFullName = m.logFilePath + m.logFileName + "_" + i.ToString("") + ".txt";
file = new FileInfo(SectionfileFullName);
} try
{
if (!file.Exists)//如果不存在 这个文件 就说明需要 创建新的部分日志文件了
{
//因为SectionfileFullName路径的文件不存在 所以创建
File.WriteAllText(SectionfileFullName, m.logMessg, encoding); FileInfo Logfile = new FileInfo(LogfileFullNqme);
if (Logfile.Exists && Logfile.Length >= LogHelper.fileSize)
//先清空 然后加上 上一个部分文件的内容
File.WriteAllText(LogfileFullNqme, File.ReadAllText(TopSectionfileFullName, encoding), encoding);//如果存在则覆盖
}
else
File.AppendAllText(SectionfileFullName, m.logMessg, encoding);//累加 //追加这次内容 到动态更新的日志文件
File.AppendAllText(LogfileFullNqme, m.logMessg, encoding);
}
catch (Exception ex)
{
throw ex;
} }
else
{
isStart = false;//标记下次可执行
break;//跳出循环
}
}
});
t.Start();
}
}
}

Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。的更多相关文章

  1. 记录Queue插入的时候报错

    Queue 队列  特性  先进先出     和栈 Stack  非常相似 不过 栈 遵循 后进先出 Queue 和Stack 都存在数据并发的 问题 public static Queue<P ...

  2. vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置)

    vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置) 直接上图,电脑上已经安装git,由于vscode没有找到git,所以v ...

  3. System.ArgumentException: 目标数组的长度不够。请检查 destIndex 和长度以及数组的下限

    扫码支付接口将要上线,近几天在优化系统性能.昨天把日志Helper类的日志记录改成了使用Queue<T>对象来实现异步处理.做了单元测试,并模拟多线程来测试后,发现正常.今天将站点部署到准 ...

  4. 小记:目标数组的长度不够。请检查 destIndex 和长度以及数组的下限。

    异常:System.ArgumentException: 目标数组的长度不够.请检查 destIndex 和长度以及数组的下限.(不好意思忘记截图了) 发生异常的代码如下: var list = ne ...

  5. MYSQL timestamp NOT NULL插入NULL的报错问题

    1. 在开发两个数据库数据同步功能的时候,需要在本地搭建一个本地的数据库作为一个本地库,然后用于同步开发库中的数据.在插入的时候出现了一个问题. 问题描述: 我们每张表中都会存在一个create_ti ...

  6. Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法

    一.写sql的方式插入到Oracle中 往oracle中插入时间  '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...

  7. 插入mysql语句报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    插入一个很简单的sql语句时候,mysql一直报错: [SQL] INSERT INTO ORDER ( id, activity_id, order_type, phone, order_amoun ...

  8. MySql数据库插入或更新报错:Cannot add or update a child row: a foreign key constraint fails

    具体报错信息: Cannot add or update a child row: a foreign key constraint fails (`xxx`.`AAA`, CONSTRAINT `t ...

  9. php里面为什么header之前有输出报错 源码分析

    众所周知,php 里面 header之前有输出的话,会报错,例如下面这样   就这个错误,我们开始查阅php源代码,到底是怎样做的,至于php源代码分析,安装,和调试时怎样配置的,我会专门写一篇文章去 ...

随机推荐

  1. Lock锁的使用示例

    Lock锁是java5用来代替synchronized的一种面向对象的锁的方案 public class LockDemo { /** * Lock是用来替换synchronized, 优点是Lock ...

  2. xtrabackup备份与恢复实践

    说明   xtrabackup  --percona 特点: 开源,在线备份innodb表 支持限速备份,避免对业务造成影响 支持流备 支持增量备份 支持备份文件压缩与加密 支持并行备份与恢复,速度快 ...

  3. 第一零五天上课 PHP TP框架下分页

    控制器代码(TestController.class.php) <?php namespace Home\Controller; use Home\Controller\EmptyControl ...

  4. spark Mllib基本功系列编程入门之 SVM实现分类

    话不多说.直接上代码咯.欢迎交流. /** * Created by whuscalaman on 1/7/16. */import org.apache.spark.{SparkConf, Spar ...

  5. ---Ubuntu 14.04 虚拟机器和主机时间同步

    先把vmware tool 装好! sudo /usr/bin/vmware-toolbox-cmd  timesync enable

  6. linux 下tomcat catalina.out日志操作

    1. 查看日志 tail -f catalina.out 会动态打印日志. 2. 查看所有日志 less -f catalina.out 打开所有日志后,默认是显示第一页,常用命令用到如下: G:到达 ...

  7. js中object类型模拟java中的map

  8. .net获取IP和MAC地址

    获取IP  解决request.UserHostAddress取不到真实IP private string GetClientIP()   {    string result = HttpConte ...

  9. ABP的事件总线和领域事件(EventBus & Domain Events)

    http://www.aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events EventBus EventBus是个单例,获得Even ...

  10. unreal3的viewport和client

    名字里带viewport/client的类不少,以及相关的类: FViewportFrame.FViewport FViewportClient/UScriptViewportClient/UGame ...