【发布时间】:2016-11-18 04:25:11
【问题描述】:
我正在升级一些旧的 WinForms 代码,并试图找出 .NET 4.6.1 的“正确方法”来重构以下内容。
当前代码在检查bool 属性时正在执行紧密的while(true) 循环。此属性将lock() 放在通用List<T> 上,然后如果它没有项目则返回true (list.Count == 0)。
循环中有可怕的Application.DoEvents(),以确保消息泵继续处理,否则会锁定应用程序。
显然,这需要结束。
我的困惑是如何开始一个基本的重构,它仍然可以检查队列长度,同时在线程上执行而不是无缘无故地耗尽 CPU。这里检查之间的延迟很好,即使是像 100 毫秒 + 这样的“长”延迟。
我打算采用一种使方法异步并让任务运行来进行检查的方法:
await Task.Run(() => KeepCheckingTheQueue());
当然,这让我处于需要...循环检查队列状态的方法的情况。
在等待、等待和可用于将这些东西移动到线程池的各种其他方法之间......关于如何最好地处理这个问题的任何建议?
【问题讨论】:
-
只需启动一个线程进行处理并在完成后引发一个事件。您可以处理事件,无需循环->检查状态。或放入Background Worker 并使用
RunWorkerCompleted事件 -
你能不能用
ConcurrentQueue<T>来替换列表? -
可以替换列表类型吗?您能否拥有自己的类来实现
IList<T>,由真实列表支持,并在Remove将计数降至0(或调用Clear)时触发您想要的行为 -
@IanMercer 我可以替换
List以删除lock()(我不确定为什么会有锁,代码不使用线程......除非原始开发人员认为这是DoEvents 循环需要?)。我真正的问题是我需要尽可能干净地在 UI 线程上移动这个while(true) -> check -> DoEvents()循环。
标签: c# .net multithreading winforms async-await