c# ne peut pas accéder à un objet supprimé
Je fais un client/serveur de l'application.
Je définir le serveur de socket d'écoute, et de définir BeginAccept() la méthode.
Et quand j'ai fermé le serveur de socket (Socket.Close()) pour éteindre le serveur,
une exception générée à partir de BeginAccept() la méthode asynchrone de la méthode de rappel.
J'ai inspecté exception, et j'ai trouvé l'exception dire moi ceci:
Message "Impossible d'accéder à un objet supprimé nommé
"Le système de.Net.Les Sockets.Socket".
Nom de l'objet: "le Système de.Net.Les Sockets.Socket"." Chaîne
À mon avis, c'est juste ceci: "La prise éliminés quand je l'appelle
Socket.La méthode Close (), mais le rappel n'a pas publié avant l'
socket fermée."
j'ai fait une recherche sur le net et j'ai trouvé ce n'est pas une erreur mais une exception comme beginaccept a été annulée.
ma question comment puis-je traiter cette excepton? ce traitement doit être pour ça?
Je vais juste le traiter comme un événement normal:
OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message);
OnUpdateNetworkStatusMessage(this, eventArgs);
tous les commentaires sont toujours les bienvenus.
Peut-être changer son nom à votre question concerne d'TcpListener ou les Sockets?
OriginalL'auteur iTEgg | 2010-01-09
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas de soins sur l'exception (c'est à dire ce n'est pas une "exception", c'est le fonctionnement normal de la procédure et arrive à chaque fois), vous pouvez simplement ignorer/supprimer. (Aussi longtemps que cela n'arrivera pas dans une situation qui indique une erreur réelle)
Si vous souhaitez supprimer plus bien placé, alors vous pouvez définir un indicateur qui indique à votre rappel qu'il devrait arrêter, et ont la fonction de rappel de réellement faire la fermeture/l'élimination de la douille. De cette façon, vous pouvez garantir qu'il n'y a pas dans l'attente de lit sur le support et ne sera pas obtenir de l'exception (mais cela signifie qu'il va accrocher indéfiniment, jusqu'à ce qu'un autre paquet est reçu ce qui, évidemment, ne peut jamais se produire).
Si vous êtes dans le contrôle des deux extrémités de la liaison de communication, vous pouvez envoyer un explicite "shutdown" message qui indique au client que la connexion doit être fermé (et cela peut bien sûr être appliquée dans la fonction de rappel lorsque le message est reçu).
(Mais j'aimerais savoir si quelqu'un a trouvé une meilleure solution que j'ai une situation similaire avec un UDP comms de mise en œuvre)
OriginalL'auteur Jason Williams