Il y a (ou il y a eu) beaucoup de discussions sur le fait qu'il est bon ou mauvais d'utiliser la méthode Thread.Sleep()
. D'après ce que je comprends, il doit principalement être utilisé à des fins de débogage.La mise en boucle Thread.Sleep() serait-elle mauvaise pour la performance lorsqu'elle est utilisée pour mettre en pause un thread?
Maintenant, je me demande: est-il mauvais à utiliser dans mon but spécifique, c'est-à-dire en le bouclant constamment pour pouvoir mettre en pause/reprendre le fil? Je fais ceci parce que je veux mettre en pause un fil qui effectue des opérations d'E/S et être capable de le reprendre d'une manière simple. Les opérations d'E/S consistent simplement à écrire des blocs de 4 096 octets dans un fichier jusqu'à ce que toutes les données y aient été écrites. Comme le fichier peut être volumineux et prendre beaucoup de temps, je veux pouvoir mettre l'opération en pause (au cas où il commencerait à manger beaucoup de ressources système).
Mon code, la version VB.NET:
'Class level.
Private BytesWritten As Long = 0
Private Pause As Boolean = False
'Method (thread) level.
While BytesWritten < [target file size]
...write 4096 byte buffer to file...
While Pause = True
Thread.Sleep(250)
End While
...do some more stuff...
End While
C# équivalent:
//Class level.
long bytesWritten = 0;
bool pause = false;
//Method (thread) level.
while(bytesWritten < [target file size]) {
...write 4096 byte buffer to file...
while(pause == true) {
Thread.Sleep(250);
}
...do some more stuff...
}
J'ai entendu parler ResetEvents et je sais un peu ce qu'ils font, mais j'ai jamais vraiment regardé beaucoup dans eux.
Je voudrais utiliser un événement de réinitialisation manuelle. Après chaque morceau, attendez l'événement. Pour mettre le fil en pause, réinitialisez l'événement. Pour reprendre le fil, définissez l'événement. –
Je ne comprends pas pourquoi vous voudriez * faire une pause * * une longue opération *. Sûrement cela le fera juste prendre plus de temps. Si vous voulez que le fichier soit écrit de manière asynchrone, pourquoi ne pas simplement utiliser le fichier asynchrone IO et attendre le résultat? –
@EricLippert: Ceci est pour si l'utilisateur de mon application veut mettre en pause, car l'opération pourrait consommer beaucoup de ressources système. –