类似于.NET中等待定时器

在非托pipeWin32世界中,我习惯于使用CreateWaitableTimer API创build等待定时器,这些定时器可用于同步调用,如WaitForSingleObject ,主要用于WaitForMultipleObjects 。

.NET和C#中的等待定时器必须有一个类比吗?

你需要什么等待计时器?

System.Threading.Tasks.Task在.NET中“我可以等待”的默认类是System.Threading.Tasks.Task 。 在.NET 4.5中,您可以简单地使用Task.Delay(milliseconds)

在.NET 4.0中,您可以使用TaskCompletionSource来创建任务,并使用普通计时器将其设置为已完成。 或者使用Async Targeting Pack或AsyncBridge中的TaskEx.Delay实现

如果您需要实际的WaitHandle ,则可以使用ManualResetEvent ,并使用普通的.NET定时器来设置事件。

或者,你可以创建自己的类,从WaitHandle和P / Invoke CreateWaitableTimer派生。 看来这样的类已经存在于.NET框架中,但它是内部的。 ( System.ServiceModel.Internals.dll System.Runtime.IOThreadTimer.WaitableTimer

 public class WaitableTimer : WaitHandle { [DllImport("kernel32.dll")] static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes, bool bManualReset, string lpTimerName); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In] ref long pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, [MarshalAs(UnmanagedType.Bool)] bool fResume); public WaitableTimer(bool manualReset = true, string timerName = null) { this.SafeWaitHandle = CreateWaitableTimer(IntPtr.Zero, manualReset, timerName); } public void Set(long dueTime) { if (!SetWaitableTimer(this.SafeWaitHandle, ref dueTime, 0, IntPtr.Zero, IntPtr.Zero, false)) { throw new Win32Exception(); } } }