我模糊地回忆起WinAPI提供了一个名为APC的东西,允许你指示一个线程代表你执行一个函数,一旦找到时间就会这样做。线程不需要等待信号,但内核为它维护了APC队列,并指示线程执行队列中的项目。
我做了一些研究如何在.NET中完成,但到目前为止我还没有找到办法做到这一点。我知道BeginInvoke但这只适用于UI控件的上下文,我相信?
我将如何在.NET环境中执行此操作?
谢谢!
答案 0 :(得分:3)
这在.NET中有些暴露,在APC用于I / O完成回调的非常特殊的情况下。这对于APC来说是非常常见的用途。它是非常低级的,就像APC一样,核心方法是ThreadPool.BindHandle(),它设置管道以允许回调在线程池线程上执行托管代码。然而,进行调用以启动重叠的I / O不是,这取决于您的行为。否则,这已经被执行I / O及其BeginXxxx()方法的各种类包装,如FileStream,PipeStream,Socket等。
您自己的APC需要的下一件事是将线程置于可警告的等待状态,相当于具有bAlertable参数的TRUE值的WaitForSingleObjectEx()。这是由CLR严重包装的,它在等待的可警告状态中占有很大的份额,因为无论管理线程是否可以安全中止,这都很重要。 Afaik,您在托管代码中调用的所有等待都是可警告的,包括Thread.Join()和Thread.Sleep()等方法。忽略WaitHandle.WaitXxx重载中名为“exitContext”的bool参数,这意味着别的。
答案 1 :(得分:1)
线程只能在一组API上阻塞时执行APC。当设置'Alertable'标志时,该组包括GetMessage()和'BlahEx'调用(例如SleepEx)。线程确实要等待一个信号 - 一个线程不能'转移'来运行APC或其他任何东西,除非它涉及到线程间通信。
不确定.NET是否具有托管SleepEx()或类似功能,但我确信托管线程可以以某种方式执行APC(帮助我,.NETters!),而无需借助非托管代码。 / p>