[QWorker] 更新:增加信号的顺序触发并修正 Delay 函数存在的问题

【更新说明】

1、QWorker 的信号作业原来是触发时立即就会调度后台线程执行,这样存在的问题就是后触发的信号可能被先执行。而有些场景下,我们需要它们按照触发的顺序执行,所以 QWorker 对信号的触发这块做了一些额外的处理:

  • 增加了一个 SignalQueue 属性,来管理信号触发队列,队列的默认大小为 4096 项。换句话说,排队的待处理信号最多有 4096 个,如果超出,你需要修改它的 MaxItems 属性。
  • 通过 SignalQueue.Post 触发的信号,会被排队处理。
  • 通过 SignalQueue.Send 或 Workers.Signal 触发的信号,会立即调度处理,不走队列。
  • SignalQueue.Send 或 Workers.Signal 时,如果要等待作业完成并指定了超时时间,需要注意:
    (1)如果信号的触发是在后台线程中,那么没有问题,超时时会及时返回 wrTimeout;
    (2)如果信号的触发是在主线程中,处理作业有在主线程中弹出窗体或内部循环等待某些东西的操作,那么,可能不会在你设定的超时时间内完成。这个是由于消息处理过程没有及时退出造成的,虽然超时时最终返回的仍是 wrTimeout。

2、Delay 函数上一个版本实现的方式有问题,由于作业二次投寄造成可能无法及时清理干净。

【严重程度】

【推荐级别】

【特别感谢】

乱世虾仁、MLSkin、红鱼儿

分享到: