C#中奇怪的Queue行为, 高手请进!

ie521 2009-09-19 01:29:36
小弟希望通过Queue<T>泛型类实现多线程异步操作, 但却在实际应用中, 遇到了十分奇怪的问题
1, 调用Queue<T>.Enqueue 方法时, 会不定时抛出ArgumentException, 错误消息为"源数组长度不足。请检查 srcIndex 和长度以及数组的下限。"

2, 调用Queue<T>.Dequeue 方法时, 会不定时返回0或null, 但队列中确从未添加过0或null.

在网上搜索了一遍, 没有找到相关资料, 只有在此劳烦各位高手大哥了, 代码贴在下面, 具体的问题已标注在注释里面, 如下:

/// <summary>
/// 此类表示任务队列, 使用独立线程执行
/// </summary>
class TaskQueue
{
/// <summary>
/// 私用默认构造函数, 此处初始化任务执行线程.
/// </summary>
private TaskQueue()
{
Thread tdTask = new Thread(new ThreadStart(this.doTask));
tdTask.IsBackground = true;
tdTask.Start();
}

/// <summary>
/// 触发执行任务的事件.
/// </summary>
private ManualResetEvent _meventDoTask = new ManualResetEvent(false);

/// <summary>
/// 要执行的任务队列
/// </summary>
/// <remarks>
/// 注意: 此处设置了Queue<T>的容量为100万
/// , 如果不设置此容量 在调用 Queue<T>.Enqueue 方法时, 会不定时抛出异常ArgumentException
/// , 消息为"源数组长度不足。请检查 srcIndex 和长度以及数组的下限。"
/// </remarks>
private Queue<int> _taskQueue = new Queue<int>(1024 * 1024);

/// <summary>
/// 将任务编号排入队列, 并触发执行.
/// </summary>
/// <param name="taskId">任务编号</param>
private void QueueTask(int taskId)
{
if (taskId != 0)
{
//注意: taskId 在排入队列前, 已做了非0验证.
this._taskQueue.Enqueue(taskId);
this._meventDoTask.Set();
}
}

/// <summary>
/// 在此方法中, 执行任务
/// </summary>
private void doTask()
{
RETRY:
this._meventDoTask.WaitOne();
this._meventDoTask.Reset();

while (this._taskQueue.Count != 0)
{
//注意: _taskQueue 中从来不加入值为0的项, 但此处用Dequeue()得到的taskId依然会随机出现0值.
//另外, 经测试, 如果 _taskQueue 存储的不是值类型, 而是 类类型, 则Dequeue()方法得到的项会随便出现null.
int taskId = this._taskQueue.Dequeue();

if (taskId != 0)
{
//do the task
}
}

goto RETRY;
}
}

...全文
346 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
boringame 2009-09-19
  • 打赏
  • 举报
回复
没有用啊。。。关注
lzsh0622 2009-09-19
  • 打赏
  • 举报
回复
Queue <T> 用多线程了? 过程全 lock
ie521 2009-09-19
  • 打赏
  • 举报
回复
while (this._taskQueue.Count != 0)

操作之前是有验证的, 有数据是前题!!!
CsToD 2009-09-19
  • 打赏
  • 举报
回复
应该是队列里没有数据还在进行操作吧
内容概要:本文围绕“【SCUC】N-1故障集+安全约束机组组合研究(Matlab代码实现)”展开,系统探讨电力系统在N-1故障场景下的安全约束机组组合(SCUC)问题,旨在实现系统安全性与运行经济性的协同优化。研究通过构建包含机组启停、出力计划、潮流约束、备用容量及N-1安全准则的数学模型,结合混合整数线性规划等优化算法,利用Matlab平台完成仿真求解,并引入YALMIP等建模工具提升建模效率。文档提供了完整的代码实现方案与测试案例,涵盖故障集的生成与处理方法,帮助用户掌握鲁棒性和分布鲁棒优化的基本思想,适用于电力系统安全校核与调度决策支持。; 适合人群:电力系统及相关专业的研究生、从事电力调度、能源优化的科研人员及工程技术人员。; 使用场景及目标:① 掌握N-1安全准则在机组组合的建模方法与实现流程;② 开展安全约束机组组合(SCUC)与安全约束经济调度(SCED)的仿真分析;③ 利用Matlab/YALMIP快速搭建电力系统优化模型并进行求解与验证。; 阅读建议:建议读者结合文档内容与网盘提供的完整资源(含代码与数据),动手实践建模与调试过程,重点关注约束条件的设定、故障场景的枚举与处理策略,同时参考相关文献深化对鲁棒优化与分布鲁棒方法的理解。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧