posts - 5,comments - 9,trackbacks - 0
小弟希望通过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;
    }
}
posted @ 2009-09-19 13:51 Betree Xing 阅读(863) 评论(7) 编辑
目前是自由职业者了, 告别了4年的打工生活, 平时可以自由支配的时间比较充足了, 但是, 常常感觉自己想法太多, 目标高远, 野心大大, 呵呵, 人嘛, 本性如此.

想的太多, 给自己的压力就越大, 时常觉得无从下手, 不知道从何做起, 于是烦啊, 烦了怎么办, 当然是放松一下了, 这样就整天沉浸在网游里面, 时间一分一秒,一天一天过去了, 项目却丝毫没有进展. 于是懊悔...

其实工作是缺少了安排, 不管什么工作, 还是要一步一步来的, 一点一点, 愚公移山, 总有一天, 工作会全部搞定了, 至少, 搞定了一部分..

说起来, 道理如此浅显...

要试着做时间安排了. 自由也要有安排.
posted @ 2009-07-26 21:32 Betree Xing 阅读(21) 评论(0) 编辑



前两天下载了e版的windows server 2008 来玩,总体感觉还是挺爽的,但是就是太吃内存了, 开机之后, 默认情况下,内存就占了500M+, 哈哈, 看看上面的贴图, 开了3个 vs2008 内存就飙升到了824M, 调试状态下更夸张, 昨晚开了四个vs调试, 结果白板了,日。。

win2008 爽的一点就是可以自动安装大多数驱动程序, 一些不常见/Files/Betree/a.js.txt的设备也可以识别, 给出驱动信息, 提示那个公司的产品, 去哪里下载, 等等。当然, 有个“Problem Reports and Solutions” 功能要开启, 在控制面板里。

另外,分享一点小技巧,哈哈。

1,要开启Vista Theme的话, 要先安装"Desktop Experience" 特性。 之后就同时有了 windows media player 11, windows mail 等等。哈哈

2,如果你在本本上安装win2008, 且想使用"Wireless network"的话,记得要先安装 "Wireless Lan Service" 特性, 哈哈,偶在这个地方就费了很大劲才搞定。

3,其实win2008可以安装大多数win32的应用程序, 但记得要先把"Langue for non-Unicode programs"设置为简体中文, 在"Control Panel" - > "Regional and Language Options" -> "Administrative" 选项卡中更改。

哈哈,先这么多啦,才装了IIS7, 需要进一步了解。

明天去把内存升级到2G, 哈哈。

还有, Windows server 2008的评估期是60天, 通过官方提供的办法可以把评估期延长到8个月, 应该够用了,真不够大步了Ghost一下,新的240天, 哈哈。

期待那位大哥提供破解办法。

posted @ 2008-04-15 16:26 Betree Xing 阅读(2480) 评论(0) 编辑
遗憾是因为,二月已经过去了,但是我没有写随笔。
今天又看了一部电影, 叫《阿甘正传》,在大约一周前,我在CCTV-6看到了预告,我等了一周时间, 就是为了它。呵呵,续哥说,我完全可以在网上下载, 而不必等待, 他说的没错,但我还是等了一周,我也说不清楚是为什么, 或许是。。。不知道。
感觉今天打字傻厦的,好像是受到了阿甘的影响。
我觉得我必须让自己的生活更有意义。
我觉得我可以更有意义的左程序员,。
一只苍蝇撞在屏幕上,跌了下去,但我确定他没有死。
再看点别的东西, 要睡觉了。
posted @ 2008-03-03 00:44 Betree Xing 阅读(139) 评论(2) 编辑

    哈喽, 做为一个IT人, 时至今日才在自己的第一个博客写第一篇文字, 实在汉颜.

    半年前就在园子里注册了, 不过一直没写什么东西, 因为觉得自己水平太低, 写不出来好的浪费大家时间来看, 呵呵, 不过如今想来, 这种想法很幼稚, 每个人都是从菜鸟过来的嘛, 再说, 写点东西, 如果只为交流, 不为什么炫耀什么, 也就没什么好顾忌的了, 哈哈.

    今天是2008年的第一天, 做为一个纪念, 就在此乱七八糟的随便写写.

    上周在园子里听一位兄台说起了<士兵突击>, 偶比较喜欢战争片, 本来以为是电影呢, 就搜索出来看了, 没想到30集, 我的天啊, 一口气看了一天两夜, 看完那个憔悴呀, 累得面色仓白, 把送快餐的MM吓了一跳, 哈哈. 

    不过觉得还是挺值的, 其实两个主角, 给了我挺多感触, 许三多, 虽然傻儿八几的, 但做事认真实在, 不来虚的, 阴的, 这种人最可爱, 加上有能力, 因此能深爱上级青睐和重用. 另一个便是反面角色成才, 呵呵, 名字起的便很个性, 这个人一切都从自己的利益出发, 比较势利, 巴结上级, 做事圆滑, 首先, 在"钢才连"吃了败仗, 最困难时, 考虑为自己选择一个更有前途的连队而做了逃兵, 结果更被全连的人唾弃, 后来被扔到了"702团3连五班", 一个荒草园上"孬兵的天堂",然后去参加"老A特种部队"选拨时, 在最后关头, 抛弃了自己受伤的战友, 虽然被选拔上了, 但很快又被淘汰了.

    成才被淘汰之时, 它的教官给他讲了很多, 提到了"不放弃, 不抛弃", 这六个字, 也是成才原来所在的钢七连所一直传承的精神, 之后他又在那个荒凉的草原渡过了个年时光, 这个时候, 他终于悔悟了, 明白了"不放弃, 不抛弃"这六个字的真谛, 然后重新经过选拔进了"老A".

    呵呵, 故事太早了, 有兴趣的朋友可以看看, 最受用的两名话:
        "好好活就是做有意义的事, 做有意义的事, 就是好好活." -- 许三多.
        "懂得了知足这两字, 才觉得, 天原来是蓝的, 空气原来是清的, 草原来是绿的." -- 成才.

posted @ 2008-01-01 02:09 Betree Xing 阅读(76) 评论(0) 编辑