【问题标题】:Win32 QueueUserAPC API alternative in .NET.NET 中的 Win32 QueueUserAPC API 替代方案
【发布时间】:2013-08-12 22:03:41
【问题描述】:

QueueUserAPC 最接近的 .NET 替代方案是什么?我应该使用SynchronizationContext.Post 吗?

【问题讨论】:

  • QUA 的工作水平要低得多。但当然,同样的想法。
  • 你想做什么? APC 有效地“接管”处于可变状态的线程——将其(暂时)从其他潜在的待处理工作中转移。 .NET 中没有任何东西专门这样做。
  • @Peter,在这种情况下,我只是想更好地了解 Win32 和 .NET 之间的 API 映射。以前我使用 QueueUserAPC 来安排一些分析任务。
  • 我不会说 QueueUserAPC 真的映射到 .NET 中的任何东西。如果您只是想异步运行代码,我建议您使用 Task 和 Task` 和/或 async/await。
  • 我相信 Monitor 会等待警报,因此您可以继续使用 QUA。也就是说,在随机点劫持线程以做其他事情似乎是一种糟糕的架构。我从来不明白 QUA 有什么好处。似乎总是一个糟糕的解决方案。

标签: .net api winapi asynchronous synchronization


【解决方案1】:

现代 .NET 试图抽象出原始线程,并用更高级别的库代替,例如任务并行库 (TPL) 或响应式扩展。

我不确定在 .NET 中线程是否存在“可警告”状态,就像您可以使用 SleepEx 获得的那样,但您始终可以使用 TPL 在进程线程池中对工作项进行排队。

Task.Start( () => { /* do work * });

如果您在那里执行某种异步 IO 操作,这将特别有效,这将允许同一线程被重用于运行另一个排队任务,而您的原始任务正在执行异步操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多