异常问题记录:

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

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

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

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

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

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

LogModel类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Web;
  8. using System.Web.UI;
  9.  
  10. namespace Common.Helper.LogHelper
  11. {
  12. /// <summary>
  13. /// 日志模型
  14. /// </summary>
  15. public class LogModel
  16. {
  17. /// <summary>
  18. /// 日志要存的路径 默认路径:网站根目录 + Log 文件夹
  19. /// </summary>
  20. public string logFilePath = HttpContext.Current.Server.MapPath("~/") + @"\Log\";
  21.  
  22. private string _logFileName;
  23.  
  24. /// <summary>
  25. /// 日志文件名字
  26. /// </summary>
  27. public string logFileName
  28. {
  29. get { return _logFileName + "_" + DateTime.Now.ToString("yyyyMMdd"); }
  30. set { _logFileName = value; }
  31. }
  32.  
  33. private string _logMessg;
  34.  
  35. /// <summary>
  36. /// 日志内容
  37. /// </summary>
  38. public string logMessg
  39. {
  40. get
  41. {
  42. return "====begin====================" + DateTime.Now.ToString() + "====Queue.Count" + LogHelper.LogQueue.Count + "====================\r\n\r\n"
  43. + _logMessg
  44. + "\r\n\r\n====end====================" + DateTime.Now.ToString() + "====Queue.Count" + LogHelper.LogQueue.Count + "===================="
  45. + "\r\n\r\n\r\n";
  46. }
  47. set { _logMessg = value; }
  48. }
  49. }
  50. }

LogHelper类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Common.Helper.LogHelper
  10. {
  11. /// <summary>
  12. /// 日志操作辅助类
  13. /// zhaopeiym@163.com
  14. /// 创建20150104 修改20150104
  15. /// </summary>
  16. public class LogHelper
  17. {
  18. /// <summary>
  19. /// 消息队列
  20. /// </summary>
  21. private static Queue<LogModel> logQueue = new Queue<LogModel>();
  22. /// <summary>
  23. /// 消息队列 对外只读
  24. /// </summary>
  25. public static Queue<LogModel> LogQueue
  26. {
  27. get { return LogHelper.logQueue; }
  28. }
  29.  
  30. /// <summary>
  31. /// 标志锁
  32. /// </summary>
  33. static string myLock = "true";
  34.  
  35. /// <summary>
  36. /// 写入日志文件
  37. /// </summary>
  38. /// <param name="logmede"></param>
  39. public static void logWrite(LogModel logmede)
  40. {
  41. // 这里需要锁上 不然会出现:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。异常
  42. //网上有资料说 http://blog.csdn.net/greatbody/article/details/26135057 不能多线程同时写入队列
  43. //其实 不仅仅 不能同时写入队列 也不能同时读和写如队列 所以 在Dequeue 取的时候也要锁定一个对象
  44. lock (myLock)
  45. logQueue.Enqueue(logmede);
  46. logStartWrite();
  47. }
  48.  
  49. /// <summary>
  50. /// 部分日志文件大小
  51. /// </summary>
  52. public static int SectionlogFileSize = * * ; // 1024Byte * 1024KB * 1MB
  53.  
  54. /// <summary>
  55. /// 变动文件大小
  56. /// </summary>
  57. public static int fileSize = * * ;
  58.  
  59. /// <summary>
  60. /// 文件编码格式
  61. /// </summary>
  62. public static Encoding encoding = Encoding.Default;
  63.  
  64. /// <summary>
  65. /// 是否开始自动记录日志
  66. /// </summary>
  67. private static bool isStart = false;
  68.  
  69. /// <summary>
  70. /// 开始把队列消息写入文件
  71. /// </summary>
  72. private static void logStartWrite()
  73. {
  74. if (isStart)
  75. return;
  76. isStart = true;
  77. Thread t = new Thread(delegate()
  78. {
  79. while (true)
  80. {
  81. if (LogHelper.logQueue.Count >= )
  82. {
  83. LogModel m = null;
  84. lock (myLock)
  85. m = LogHelper.logQueue.Dequeue();
  86. if (m == null)
  87. continue;
  88. if (!Directory.Exists(m.logFilePath))
  89. Directory.CreateDirectory(m.logFilePath);
  90.  
  91. int i = ;
  92. //部分 日志 文件路径
  93. string SectionfileFullName = m.logFilePath + m.logFileName + "_" + i.ToString("") + ".txt";
  94. //最新的写了内容的 部分 日志文件路径
  95. string TopSectionfileFullName = SectionfileFullName;
  96. // 需要实时更新的 最新日志文件 路径
  97. string LogfileFullNqme = m.logFilePath + m.logFileName + ".txt";
  98.  
  99. FileInfo file = new FileInfo(SectionfileFullName);
  100. while (file.Exists && file.Length >= LogHelper.SectionlogFileSize)
  101. {
  102. TopSectionfileFullName = SectionfileFullName;
  103. i++;
  104. SectionfileFullName = m.logFilePath + m.logFileName + "_" + i.ToString("") + ".txt";
  105. file = new FileInfo(SectionfileFullName);
  106. }
  107.  
  108. try
  109. {
  110. if (!file.Exists)//如果不存在 这个文件 就说明需要 创建新的部分日志文件了
  111. {
  112. //因为SectionfileFullName路径的文件不存在 所以创建
  113. File.WriteAllText(SectionfileFullName, m.logMessg, encoding);
  114.  
  115. FileInfo Logfile = new FileInfo(LogfileFullNqme);
  116. if (Logfile.Exists && Logfile.Length >= LogHelper.fileSize)
  117. //先清空 然后加上 上一个部分文件的内容
  118. File.WriteAllText(LogfileFullNqme, File.ReadAllText(TopSectionfileFullName, encoding), encoding);//如果存在则覆盖
  119. }
  120. else
  121. File.AppendAllText(SectionfileFullName, m.logMessg, encoding);//累加
  122.  
  123. //追加这次内容 到动态更新的日志文件
  124. File.AppendAllText(LogfileFullNqme, m.logMessg, encoding);
  125. }
  126. catch (Exception ex)
  127. {
  128. throw ex;
  129. }
  130.  
  131. }
  132. else
  133. {
  134. isStart = false;//标记下次可执行
  135. break;//跳出循环
  136. }
  137. }
  138. });
  139. t.Start();
  140. }
  141. }
  142. }

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. WPF 自定义控件

    在实际工作中,面对不同的客户需求,需要让空间显示出不同的效果.当style已经不能足够满足客户需求时,就需要程序猿自己设计自定义控件了. 根据工作经历,LZ做了个关于自定义控件的小Demo,仅供参考. ...

  2. 关于DCOM的安全性

    关于DCOM的安全性 DCOM的安全性设置在注册表中. 2. 通过DCOMCNF.exe可以配置

  3. highcharts 统计的样式

    highcharts 官网:http://www.hcharts.cn/

  4. 2016.02.17 JS DOM编程艺术 第四五六章

    看完这三章内容,集中精力,加快速度.

  5. console.log的应用

    这两天在学javascript,但是有个问题老是觉得很疑惑,那就是这两个表达式到底有啥区别,虽然结果输出都差不多,但是我想这个两个表达式被开发出来,肯定是有意义的吧!哪位高手解答下吧!Thanks i ...

  6. HttpURLConnection 下载文件

    String fileUrl = request.getRequestURL().substring(0, request.getRequestURL().indexOf("/rest&qu ...

  7. 读取当前键值,并赋值给LED

    /********************************* 代码功能:读取当前键值,并赋值给LED 使用函数: digitalRead(数字输入端口号); 创作时间:2016*10*07 作 ...

  8. 千人基因组计划数据库下载某段区域SNP

    进入http://browser.1000genomes.org/index.html网站 假定要寻找“6:133098746-133108745”这段距离的SNP数据,“6”表示6号染色体,后面的数 ...

  9. Python全栈之路8--迭代器(iter)和生成器(yield)

    一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...

  10. UVA 753 A Plug for UNIX(二分图匹配)

    A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the Unit ...