在非托pipeWin32世界中,我习惯于使用CreateWaitableTimer API创build等待定时器,这些定时器可用于同步调用,如WaitForSingleObject ,主要用于WaitForMultipleObjects 。
.NET和C#中的等待定时器必须有一个类比吗?
什么是控件的“On_Load”等效表单?
简单的C#应用程序无法正常工作,在Visual Studio中运行时工作正常
旧的本地应用程序可以在Windows8平板电脑版上运行吗
在Linux下将ASP.NET应用程序移植到Mono / Apache
我如何获得当前.exe的散列?
你需要什么等待计时器?
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,IntPtr.Zero,false)) { throw new Win32Exception(); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。