使用事件等待句柄进行调度
本文关键字:调度 句柄 等待 事件 | 更新日期: 2023-09-27 18:07:59
我正在尝试使用EventWaitHandle类创建一个调度实现
看下面的例子:
// Program 1
static void Main(string[] args)
{
EventWaitHandle wh = new EventWaitHandle(false,EventResetMode.ManualReset,"MyCrossProcessEventHandle");
wh.Set();
}
// Program 2
static void Main(string[] args)
{
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.ManualReset, "MyCrossProcessEventHandle");
while (true)
{
var span = CalculateSpan();
wh.WaitOne(span);
// TODO Implement check, why did execution proceed?
// timeout ocurred
// OR
// Eventhandle was set
//
// if timeout occured
// break the current iteration loop (And thereby calculate a new timeout)
//
// if event.set
// continue execution
// SNIP SNIP - More code here
}
}
private static int CalculateSpan()
{
DateTime datetoRun = new DateTime(2020,01,01,00,00,00);
var span = datetoRun - DateTime.Now;
if (span.TotalMilliseconds >= int.MaxValue)
{
return int.MaxValue;
}
return (int)span.TotalMilliseconds;
}
读取代码中的TODO
归结为:所以我希望能够安排多于int的执行。,并手动强制跨进程执行
也许是实现完全相同场景的更简单的方法?
如果你想等待一段时间再做某事,你可以使用:
-
Thread.Sleep
- 不推荐,因为这会阻塞线程,通常被认为是不好的做法(除非你在一个单独的线程上,你可以阻塞)
-
Timer
- 最常见的解决方案,因为它支持异步触发定时器事件,所以它不会干扰你的主线程等。
你也可以启动一个新的线程/Task
,等待一段时间后再做一些事情:
Task.Factory.StartNew(() =>
{
Thread.Sleep(CalculateSpan());
// Do something here because the time to wait has passed now
});
阅读文档(DOH)后,我找到了解决方案
// Summary:
// Blocks the current thread until the current System.Threading.WaitHandle receives
// a signal, using a 32-bit signed integer to specify the time interval.
//
// SNIP SNIP
//
// Returns:
// true if the current instance receives a signal; otherwise, false.
//
// SNIP SNIP
public virtual bool WaitOne(int millisecondsTimeout);