J'ai lu la documentation pour ReadDirectoryChangesW()
et également vu le CDirectoryChangeWatcher
project, mais aucun ne dit pourquoi on voudrait l'appeler de manière asynchrone. Je comprends que le thread actuel ne bloquera pas, mais, au moins pour le code CDirectoryChangeWatcher qui utilise un port d'achèvement, lorsqu'il appelle GetQueuedCompletionStatus()
, bloque les threads de toute façon (s'il n'y a pas de modifications). En premier lieu, si j'appelle de façon synchrone ReadDirectoryChangesW()
dans un thread séparé que je ne m'inquiète pas s'il bloque, pourquoi voudrais-je jamais appeler ReadDirectoryChangesW()
de manière asynchrone?Pourquoi utiliser ReadDirectoryChangesW de manière asynchrone?
Répondre
Lorsque vous l'appelez de manière asynchrone, vous avez plus de contrôle sur thread fait l'attente. Il vous permet également d'avoir un seul thread d'attente pour plusieurs choses, comme un changement de répertoire, un événement et un message. Enfin, même si vous faites l'attente dans le même fil que la montre en premier lieu, cela vous donne le contrôle sur combien de temps vous êtes prêt à attendre. GetQueuedCompletionStatus
possède un paramètre de délai d'attente que ReadDirectoryChangesW
n'offre pas par lui-même.
Vous appelez ReadDirectoryChangesW de telle sorte qu'il renvoie ses résultats de manière asynchrone si vous avez besoin que le thread appelant ne bloque pas. Une tautologie, mais la vérité.
Candidats pour ces discussions: le fil d'interface utilisateur & tout thread qui est seul responsable de l'entretien d'un certain nombre de ressources (Sockets, tout type d'IPC, fichiers indépendants, etc.).
N'étant pas familier avec le projet, je suppose que le CDirectoryChangeWatcher ne se soucie pas si son thread de travail bloque. Généralement, c'est la nature des threads de travail.
J'ai essayé d'utiliser ReadDirectoryChanges dans un thread de travail de manière synchrone, et devinez quoi, il a bloqué afin que le thread ne puisse pas sortir de lui-même à la sortie du programme. Donc, si vous ne voulez pas utiliser des choses malveillantes comme TerminateThread, vous devez utiliser des appels asynchrones.
Si le thread ne s'est pas arrêté, vous n'avez pas vraiment dit au système d'exploitation que votre processus était terminé. 'ExitProcess' termine tous les threads. –
De MSDN: « Comment les processus sont terminés: Un processus exécute jusqu'à ce que l'un des événements suivants: - Tout thread du processus appelle la fonction ExitProcess ... Ne pas mettre fin à un processus à moins que ses fils. Si un thread attend un objet noyau, il ne sera pas terminé tant que l'attente ne sera pas terminée, ce qui peut entraîner le blocage de l'application. –
- 1. ReadDirectoryChangesW asynchrone()?
- 2. Comment utiliser HttpWebRequest (.NET) de manière asynchrone?
- 3. Blocage de thread lors de l'utilisation de ReadDirectoryChangesW de manière asynchrone
- 4. Copie dirigée de manière asynchrone
- 5. Erreur envoi de courrier de manière asynchrone
- 6. Pourquoi ReadDirectoryChangesW omet-il des événements?
- 7. plusieurs webrequests de manière asynchrone dans asp.net?
- 8. Comment utiliser la méthode ReadDirectoryChangesW() avec la routine d'achèvement?
- 9. Appel du service WCF de manière asynchrone dans une boucle
- 10. Comment peupler un ListView en mode virtuel de manière asynchrone?
- 11. Exécution de fichier batch commandes de Windows de manière asynchrone
- 12. L'appel de deux méthodes de manière asynchrone dans ASP.NET 2.0
- 13. Les gestionnaires d'événements sont-ils traités de manière asynchrone?
- 14. Roches du KVO. Maintenant, comment l'utiliser de manière asynchrone?
- 15. Java ne fait-il pas les choses de manière asynchrone?
- 16. Mise en œuvre de ReadDirectoryChangesW
- 17. Utiliser AdjustTokenPrivileges de manière sécurisée/robuste?
- 18. Comment utiliser GNU Screen de manière transparente
- 19. JavaScript étant chargé de manière asynchrone dans Firefox 3 (selon Firebug)?
- 20. Socket lire les données de manière asynchrone avec terminaison de message spécial
- 21. Problème de liaison de données avec la classe qui est mise à jour de manière asynchrone
- 22. Est-il possible d'appeler des applets de commande powershell de manière asynchrone?
- 23. Appel des services Web .NET de manière asynchrone à partir de Java
- 24. asp.net - Comment mettre à jour une boîte de texte de manière asynchrone pendant un long processus?
- 25. Pourquoi mon ReadDirectoryChangesW ne récupère-t-il pas les fichiers modifiés?
- 26. C# problème de socket asynchrone
- 27. Comment empêcher les modifications de fichiers manquantes dans ReadDirectoryChangesW
- 28. Comment interroger de manière asynchrone un fichier à l'aide d'une minuterie flash sans bloquer l'interface utilisateur?
- 29. Comment appeler une page asp.net en utilisant de manière asynchrone JQuery
- 30. Comment chercher des données de manière asynchrone pour une saisie semi-automatique TextBox?
Alors vous dites qu'il n'y a pas de bonne raison? Encore une fois, comme je l'ai dit à l'origine, si je me souciais si le fil courant bloque, je créerais un fil séparé que je m'en fous s'il bloque. –
La création d'un thread n'est pas toujours une option (bonne), et une API va essayer de desservir autant d'utilisateurs que possible, donc l'option asynchrone. –