类似于 .NET 中的可等待计时器

2024-01-05

在非托管 Win32 世界中,我习惯于用创建等待定时器 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682492%28v=vs.85%29.aspx可用于同步调用的 API,例如等待单个对象 http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx并且主要是为了等待多个对象 http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025%28v=vs.85%29.aspx.

.NET 和 C# 中一定有类似可等待计时器的东西吗?


您需要等待计时器做什么?

.NET 中“我可以等待的东西”的默认类是System.Threading.Tasks.Task http://msdn.microsoft.com/en-us/library/vstudio/system.threading.tasks.task(v=vs.100).aspx。在.NET 4.5中,您可以简单地使用Task.Delay(milliseconds) http://msdn.microsoft.com/en-us/library/vstudio/hh194873(v=vs.110).aspx.

在 .NET 4.0 中,您可以使用TaskCompletionSource http://msdn.microsoft.com/en-us/library/dd449174(v=vs.110).aspx创建任务,并使用普通计时器将其设置为已完成。或者使用TaskEx.Delay实施从异步定位包 http://www.microsoft.com/en-us/download/details.aspx?id=29576 or 异步桥 http://omermor.github.io/AsyncBridge/

如果您需要实际的WaitHandle http://msdn.microsoft.com/en-us/library/system.threading.waithandle(v=vs.110).aspx,你可以使用ManualResetEvent http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(v=vs.110).aspx,并使用普通的 .NET 计时器来设置事件。

或者,您可以创建自己的类,派生自WaitHandle和 P/调用CreateWaitableTimer http://msdn.microsoft.com/en-gb/library/windows/desktop/ms682492(v=vs.85).aspx。 看起来.NET框架中已经存在这样的类,但它是内部的。 (System.Runtime.IOThreadTimer.WaitableTimer http://referencesource.microsoft.com/#System.ServiceModel.Internals/System/Runtime/IOThreadTimer.cs#601 from System.ServiceModel.Internals.dll)

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();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类似于 .NET 中的可等待计时器 的相关文章

  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • SymmetricDS 同步未完美同步

    我有一台运行 SymmetricDS 的 3 个服务器 假设我有节点 1 是主节点 节点 2 节点 3 是子节点 当某些数据插入节点 2 时 它会同步到节点 1 同样 节点 3 的数据也会同步到节点 1 但节点 2 的数据不会发送到节点 3
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 开玩笑 setTimeout 不暂停测试

    it has working hooks async gt setTimeout gt console log Why don t I run expect true toBe true 15000 我已经查看了这个答案 Jest 文档和几
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户

随机推荐

  • 高效的 XMPP 用户搜索

    我想有效地检查所有本地地址簿联系人 如果他们有 jabber 帐户 用户使用手机号码在XMPP服务器上注册 我当前将以下 XEP 0055 节发送到 ejabberd 服务器并评估结果
  • 容器之间的连接被拒绝

    我尝试将运行 spring boot 2 应用程序的容器链接到运行 mongo 的容器 但连接被拒绝 docker compose 文件有一个 mongo 容器 稍后也会在此处添加另一个用于 spring boot 的容器 version
  • 如何识别这些图像中字母的颜色?

    我在用本文 https code msdn microsoft com windowsdesktop Solving Captcha with C dadf37cd解决验证码问题 它的工作原理是使用 AForge 从图像中删除背景 然后将
  • 如何在 JavaScript 中创建 url 预览?

    有人可以帮助我在 JavaScript 中创建 url 预览吗 我的意思是这样的 假设我的网站上有一个链接 我希望用户能够将鼠标悬停在该链接上 并弹出一个图像 显示链接目标的外观 不用担心 CSS 我已经可以正常工作了 我只需要实际的脚本来
  • 为什么我的 C# 程序在分析器中速度更快?

    我有一个相对较大的系统 到目前为止约 25000 行 用于监视无线电相关设备 它使用最新版本的 ZedGraph 显示图表等 该程序是在Win7下的VS2010上使用C 编写的 问题是 当我从 VS 中运行该程序时 它运行缓慢 当我从构建的
  • Excel VBA 查询访问失败

    我正在尝试使用 VBA 从 excel 查询访问文件 但出现错误rs Open queryStatement conn adOpenStatic adLockOptimistic 错误是 运行时错误 2147217904 80040e10
  • Visual Studio 2012 上的 vc++ 项目缺少 mfc110ud.dll

    我使用VS 2012 IDE在vc 中编写了一个vc 项目 它在我的系统中运行良好 当我尝试在其他系统 其中没有 VS2012 上运行时 我们收到 MFC110ud dll 丢失 错误 第一张图片 我尝试手动放置该 dll 但它说非法使用
  • 将函数添加到枚举

    是否可以在 TypeScript 中向 Enum 类型添加函数 例如 enum Mode landscape portrait the dream toString console log this Or class ModeExtensi
  • Lambda 表达式用于访问一个对象的属性,该属性是 C# 中另一个对象的属性

    我有这两门课 public class Contratos public int EntidadeFinanceiraId get set Column Nome public EntidadesFinanceiras entidadeFi
  • ITL(iTunes 库)格式

    我正在开发一个用于管理 iTunes 库 ITL 文件 的 Java 解决方案 ITL 格式是一种专有格式 我正在寻找有关 ITL 格式的实现或文档 但 Google 找不到任何有用的东西 有人有这方面的经验吗 在哪里可以找到更多信息 提前
  • jquery 有等价的 dojo.hitch() 吗?

    原谅我的无知 因为我对 jquery 不太熟悉 有没有相当于道场 hitch http dojotoolkit org reference guide 1 7 dojo hitch html 它返回一个保证在给定范围内执行的函数 编辑 根据
  • ReactJS:如何从另一个组件更新组件

    我正在尝试写一个简单的textarea字符计数器小部件ReactJS http facebook github io react 学习如何使用它 但我现在知道如何通过火来设定价值textarea onChange event 这就是我编写应
  • jQuery 获取选择选项的名称

    我有一个包含多个选项的下拉列表 每个选项都有一个名称属性 当我选择一个选项时 需要出现不同的复选框列表 当选择另一个选项时 该复选框列表应该消失并显示另一个复选框 我创建了这些复选框列表 并为它们提供了一个与所选选项的名称属性相关的 ID
  • 获取“[object HTMLDivElement]”而不是其内容?

    我只想创建原始副本divs 位于一个带有一个案例的新 div 中 Case 1 复制那些具有favouriteid 的新 div 内的类fav items 我已经尝试过 我都尝试过innerHTML and appendChild 方法 当
  • 如何将多个jar添加到groovyConole/groovysh的类路径中?

    我不得不问这个问题 这感觉很荒谬 但我似乎无法将多个 jar 文件添加到 groovyConsole 和 groovysh 的类路径中 如何将多个 jar 文件添加到类路径 这是我尝试过的 groovyConsole cp lib comp
  • Sequelize - 如何仅返回数据库结果的 JSON 对象?

    所以我想要返回数据库结果而不是其他 目前我正在返回一大块 JSON 数据 如下所示 但我只需要 dataValues 属性 我不想使用这一点JSON检索它 tagData 0 dataValues tagId 我刚刚注意到 当它发现并且不创
  • Scala中有SoftHashMap吗?

    我知道这个问题是针对java的 https stackoverflow com questions 264582 is there a softhashmap in java 但这些实现似乎都不能很好地配合scala collection
  • 主循环旁边的多处理

    我现在正在为一个问题苦苦挣扎一段时间 我正在构建一个使用主循环的小脚本 这是一个需要用户注意的过程 用户对步骤做出响应 然后使用某些功能会发生一些神奇的事情 除此之外 我想生成另一个进程来监视计算机系统的某些特定事件 例如按特定键 如果发生
  • 使用C#设置HTML输入文本框的显示文本

    我的 ASPX 页面中有一个 HTML 输入框 如下所示
  • 类似于 .NET 中的可等待计时器

    在非托管 Win32 世界中 我习惯于用创建等待定时器 http msdn microsoft com en us library windows desktop ms682492 28v vs 85 29 aspx可用于同步调用的 API