【发布时间】:2012-09-19 13:42:39
【问题描述】:
我有一个通过按钮单击触发的后台异步任务。我有一个 IsBusy 属性,该属性在任务开始时和 finally 块内更新,以说明取消或完成。
目前我的按钮点击事件会取消之前的Task,并在再次点击时启动一个新的Task;但是,由于第一个任务的取消可能会在新任务的开始之后持续存在,布尔值IsBusy 指示器可能会变得不同步。
我的问题是如何处理这种情况。
我当前的解决方案不是直接更新布尔值,而是使用在开始和完成时递增/递减的整数 - IsBusy 属性返回 BusyCount > 0。然而,这需要增加线程安全性,并且感觉不是一个好的解决方案。
另一个想法是在任务被触发时存储它,并且只启动新任务作为第一个任务的延续。这解决了取消问题,但会导致不必要的延迟(尽管是部分延迟)和调用者而不是任务的“合同”。
我最后的想法是创建一个类似于 BusyTokenSource 类的东西,它分发一次性 BusyTokens,这些 BusyTokens 从线程安全集合中添加/删除。但这似乎有点过头了。
是否有更好/正确/通用的方法来处理这种情况?
编辑:
我最终还是按照上面的最后一个想法编写了“BusyToken”类。这样,我可以简单地将函数包装在 using(BusyTokenSource.GetToken()){} 中,并让内部集合和 Dispose 处理计数和忙碌状态。
【问题讨论】:
标签: .net wpf task-parallel-library async-await cancellation