在从事一个大型项目时,我意识到我要打很多电话来安排将来的时间。由于这些都是相当轻量级的,我认为使用单独的调度程序可能会更好。
ThreadPool.QueueUserWorkItem (() =>
{
Thread.Sleep (5000);
Foo (); // Call is to be executed after sometime
});
所以我创建了一个单独的调度程序类,它在自己的线程上运行并执行这些事件。我有 2 个函数可以从不同的线程访问共享队列。我会使用锁,但由于其中一个线程需要休眠等待,我不确定如何释放锁。
class Scheduler
{
SortedDictionary <DateTime, Action> _queue;
EventWaitHandle _sync;
// Runs on its own thread
void Run ()
{
while (true)
{
// Calculate time till first event
// If queue empty, use pre-defined value
TimeSpan timeDiff = _queue.First().Key - DateTime.Now;
// Execute action if in the next 100ms
if (timeDiff < 100ms)
...
// Wait on event handle for time
else
_sync.WaitOne (timeDiff);
}
}
// Can be called by any thread
void ScheduleEvent (Action action, DataTime time)
{
_queue.Add (time, action);
// Signal thread to wake up and check again
_sync.Set ();
}
}
虽然这有点面向 C#,但我很高兴听到对此的一般解决方案。谢谢!