La compréhension des Flux et leur durée de vie (Chasse d'eau, Disposer, à Proximité)
Remarque: j'ai lu les deux questions suivantes: les
Pouvez-vous expliquer le concept de cours d'eau?
Je code en C#
- Dans presque tous les exemples de code qui utilisent des ruisseaux, des .Dispose(), .Flush(), .Close() sont presque toujours appelé.
- À la notion de flux, de quoi s'accomplir?
- Si je n'ai pas de disposer d'un flux que j'ai stocké dans une variable, ma demande est une fuite quelque part?
- Pourquoi dois-je appeler l'une de ces fonctions? J'ai vu des exemples de code qui ne font pas cela et toujours faire le travail (sans apparente rupture)
Je suis actuellement à la construction d'une classe dans mon application qui contient une méthode primaire (appelons cela GetStream()
) qui renvoie un flux de données via myWebRequest.GetResponse().GetResponseStream()
La principale méthode GetStream()
renvoie une Stream
de l'objet qui peut être utilisée pour toute opération qui requiert un flux (StreamReader, Bitmap (), etc.).
Est-il un moyen d'avoir le flux Éliminés automatiquement après sa dernière utilisation (garbage collector?) sans forcer quelqu'un qui appelle .GetStream()
manuellement en disposer?
Comme vous pouvez sans doute dire, mes questions sont vagues et générales. Ma compréhension de flux n'est pas solide, de sorte que tous les liens utiles articles qui offrent un regard plus en profondeur les cours d'eau que DONC, la question peut offrir serait appréciée.
Vous devez vous connecter pour publier un commentaire.
Disposant d'un flux de ferme (et probablement ne le fait pas grand chose d'autre.) La fermeture d'un flux de bouffées de chaleur, et libère toutes les ressources liées à la rivière, comme un descripteur de fichier. La vidange d'un ruisseau prend toutes les données mises en mémoire tampon, ce qui n'a pas encore été écrit, et écrit tout de suite; certains cours d'eau utiliser la mise en mémoire tampon interne pour éviter de faire une tonne de petites mises à jour relativement cher comme un fichier de disque ou un réseau de tuyaux.
Vous avez besoin pour l'appeler
Close
ouDispose
sur la plupart des cours d'eau ou votre code est incorrect, car la ressource sous-jacente ne sera pas libéré pour quelqu'un d'autre l'utiliser jusqu'à ce que le garbage collector vient (qui sait combien de temps cela va prendre.)Dispose
est préféré comme une question de cours; il est prévu que vous devrez éliminer tous les jetables choses en C#. Vous avez probablement n'avez pas à appelerFlush
explicitement dans la plupart des scénarios.En C#, il est idiomatique appel
Dispose
par voie deusing
bloc, ce qui est sucre syntaxique pour essayer enfin de bloc qui dispose dans le, enfin, par ex.:est fonctionnellement identique à
Dispose
. La fermeture d'un cours d'eau peut nécessiter d'effectuer des actions qui ne peut pas être garantie pour le succès; les implémentations deClose
généralement jeter une exception lorsque de tels problèmes se produisent, alors que certainsDispose
implémentations peuvent étouffer de telles exceptions (avaler de telles exceptions est le mal, mais leur permettant de se propager hors deDispose
souvent tabasser un précédent exception, qui est aussi le mal; implémentations diffèrent quant à qui le mal est considéré comme le moins élevé).using
bloc directement tire parti de l'interface IDisposable, l'appel de laDispose()
méthode relatif à l'étendue de sortie: msdn.microsoft.com/en-us/library/...