// Test task static async Task TestAsync(CancellationToken token) { using (var awaiter = new Awaiter()) { WaitOrTimerCallbackProc callback = (a, b) => awaiter.Continue(); IntPtr timerHandle; if (!CreateTimerQueueTimer(out timerHandle, IntPtr.Zero, callback, IntPtr.Zero, 500, 500, 0)) { throw new System.ComponentModel.Win32Exception( Marshal.GetLastWin32Error()); } try { var i = 0; while (true) { token.ThrowIfCancellationRequested(); await awaiter; Console.WriteLine("tick: " + i++); } } finally { DeleteTimerQueueTimer(IntPtr.Zero, timerHandle, IntPtr.Zero); } } }
static async Task TestAsync() { var tcs = new TaskCompletionSource <bool>(); WaitOrTimerCallbackProc callback = (a, b) => tcs.TrySetResult(true); //var gch = GCHandle.Alloc(tcs); try { IntPtr timerHandle; if (!CreateTimerQueueTimer(out timerHandle, IntPtr.Zero, callback, IntPtr.Zero, 2000, 0, 0)) { throw new System.ComponentModel.Win32Exception( Marshal.GetLastWin32Error()); } await tcs.Task; } finally { //gch.Free(); GC.KeepAlive(callback); } }
public static extern bool CreateTimerQueueTimer(out IntPtr phNewTimer, IntPtr TimerQueue, WaitOrTimerCallbackProc Callback, IntPtr Parameter, uint DueTime, uint Period, UIntPtr Flags);