我已阅读ReadDirectoryChangesW()
的文档并看过CDirectoryChangeWatcher
project,但都没有说为什么会想要异步调用它。我知道当前线程不会阻塞,但是,至少对于使用完成端口的CDirectoryChangeWatcher代码,当它调用 GetQueuedCompletionStatus()
时, 线程阻塞无论如何(如果没有变化)。
因此,如果我首先在一个单独的线程中同步调用ReadDirectoryChangesW()
,我不在乎它是否阻塞,为什么我想要异步调用ReadDirectoryChangesW()
?
答案 0 :(得分:5)
当您异步调用它时,您可以更好地控制哪个线程在等待。它还允许您让单个线程等待多个事物,例如目录更改,事件和消息。最后,即使您在首先设置手表的同一个线程中进行等待,它也可以让您控制您愿意等待的时间。 GetQueuedCompletionStatus
有一个ReadDirectoryChangesW
自身不提供的超时参数。
答案 1 :(得分:1)
如果您需要调用线程不阻塞,您可以调用ReadDirectoryChangesW,使其以异步方式返回其结果。一个重言式,但事实。
此类主题的候选人:UI线程&任何专门负责服务多个资源的线程(套接字,任何类型的IPC,独立文件等)。
不熟悉这个项目,我猜想CDirectoryChangeWatcher不关心它的工作线程是否阻塞。通常,这是工作线程的本质。
答案 2 :(得分:0)
我尝试在工作线程中同步使用ReadDirectoryChanges,并猜测是什么,它被阻止,以便线程不会在程序出口处自行退出。 所以如果你不想使用像TerminateThread这样的邪恶东西,你应该使用异步调用。