【发布时间】:2016-04-19 18:14:27
【问题描述】:
假设我有一个名为Scheduler 的类,其中包含<UserId, Task> 的Dictionary,任务不断循环并更新内部字典,其中包含该用户<UserId, Schedule> 的时间表以及来自数据库的信息,即我想要实时更新信息。
我想在Scheduler 类GetScheduleForUser 上有一个方法,它检查是否有该用户的任务,如果没有,它将创建任务,等待它完成,然后检索Schedules为该用户(延迟加载)。
我的问题是,在任务的第一次迭代之后,我将有一个可用的时间表,我可以检索时间表...没问题,但对于第一次迭代,我需要等到任务完成至少一个检索时间表之前的时间。
我可以开始任务并创建一个 while 循环,直到在第一次循环完成时设置某个标志,但在我看来有更好的方法,它只对第一次迭代有用.之后时间表将始终可用,我不需要该功能。
有没有人有一个干净的方法来完成这个?
【问题讨论】:
-
您可以使用
TaskCompletionSource, SemaphoreSlim, ManualResetEventSlim, Mutex等同步原语之一。 -
我正在考虑这样做。问题是我每次都会重置手动事件,即使我真的只需要第一次来确保我拥有所有数据
-
看看使用
Lazy和ConcurrentDictionary:blogs.endjin.com/2015/10/… -
如果你的池中有多个线程要运行,这种设计无论如何都不起作用,webgarden 风格......如果你不能控制它,那么你就有问题了。
标签: c# asp.net .net multithreading task