5

我已经阅读了该项目的文档ReadDirectoryChangesW()并查看了该CDirectoryChangeWatcher项目,但都没有说明为什么要异步调用它。我知道当前线程不会阻塞,但是,至少对于使用完成端口的 CDirectoryChangeWatcher 代码,当它调用时 GetQueuedCompletionStatus()线程无论如何都会阻塞(如果没有更改)。

因此,如果我ReadDirectoryChangesW()首先在一个单独的线程中同步调用,而我不在乎它是否阻塞,我为什么要ReadDirectoryChangesW()异步调用呢?

4

3 回答 3

6

当您异步调用它时,您可以更好地控制哪个线程进行等待。它还允许您让单个线程等待多个事物,例如目录更改、事件和消息。最后,即使您在最初设置手表的同一线程中进行等待,它也可以让您控制愿意等待的时间。GetQueuedCompletionStatus有一个ReadDirectoryChangesW自身不提供的超时参数。

于 2009-07-14T18:02:53.547 回答
1

如果您需要调用线程不阻塞,您将调用 ReadDirectoryChangesW 以便它异步返回其结果。重言式,但事实。

此类线程的候选者:UI 线程和任何单独负责服务大量资源(套接字、任何类型的 IPC、独立文件等)的线程。

不熟悉该项目,我猜 CDirectoryChangeWatcher 并不关心它的工作线程是否阻塞。通常,这是工作线程的本质。

于 2009-07-14T17:31:51.830 回答
1

我尝试ReadDirectoryChanges在工作线程中同步使用,你猜怎么着,它被阻塞了,这样线程就不会在程序退出时自行退出。所以如果你不想使用像 TerminateThread 这样邪恶的东西,你应该使用异步调用。

于 2010-01-30T20:58:19.700 回答