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;
}
}

...全文
286 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
  • 打赏
  • 举报
回复
应该是队列里没有数据还在进行操作吧

110,534

社区成员

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

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

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