Une bonne méthode consiste à dériver de TcpClient et à surcharger la méthode Disposing(bool) :
class MyClient : TcpClient {
public bool IsDead { get; set; }
protected override void Dispose(bool disposing) {
IsDead = true;
base.Dispose(disposing);
}
}
Ce qui ne fonctionnera pas si l'autre code a créé l'instance. Vous devrez alors faire quelque chose de désespéré, comme utiliser Reflection pour obtenir la valeur du membre privé m_CleanedUp. Ou bien attraper l'exception.
Franchement, rien de tout cela n'est susceptible d'aboutir à une très bonne fin. Vous avez vraiment a fait veulent écrire sur le port TCP. Mais vous ne le ferez pas, ce code bogué que vous ne pouvez pas contrôler est maintenant sous le contrôle de votre code. Vous avez augmenté l'impact du bug. Parler au propriétaire de ce code et trouver une solution est de loin la meilleure solution.
EDIT : Un exemple de réflexion :
using System.Reflection;
public static bool SocketIsDisposed(Socket s)
{
BindingFlags bfIsDisposed = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty;
// Retrieve a FieldInfo instance corresponding to the field
PropertyInfo field = s.GetType().GetProperty("CleanedUp", bfIsDisposed);
// Retrieve the value of the field, and cast as necessary
return (bool)field.GetValue(s, null);
}
3 votes
stackoverflow.com/questions/192206/
0 votes
Je savais que ce problème en général est trop commun pour ne pas avoir de questions et réponses sur stackoverflow mais j'ai omis de le rechercher.