2010-01-09 17 views
7

Estoy haciendo una aplicación de servidor/cliente.C# no se puede acceder a un objeto eliminado

Configuré el socket del servidor para escuchar y configuré el método BeginAccept(). Y cuando cerré el socket del servidor (Socket.Close()) para apagar el servidor, una excepción lanzada desde el método de devolución de llamada asincrónico del método BeginAccept(). inspeccioné excepción, y me encontré con la excepción de que diga esto:

mensaje "No se puede acceder a un objeto desechado llamado 'System.Net.Sockets.Socket' Nombre del objeto: 'System.Net.Sockets.Socket' " Cadena

En mi opinión, esto es sólo esto: "La toma dispuesto cuando llamo método Socket.close(), pero la devolución de llamada no publicados antes de la toma de cerrado."

hice la búsqueda en la red y encontré que esto no es un error, pero una excepción diseñada como beginaccept fue cancelada.

mi pregunta ¿cómo manejo este excepton? ¿Qué procesamiento tiene que haber para eso?

sólo voy a tratarlo como un evento normal:

 OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message); 
     OnUpdateNetworkStatusMessage(this, eventArgs); 

cualquier comentario todavía son bienvenidos.

+0

bien revisé el código y sí, puedo estar seguro al manejarlo, ya que un mensaje amigable no expone la aplicación al fallo. gracias. – iTEgg

+0

¿Quizás retitule su pregunta para pertenecer a TcpListener o Sockets? –

Respuesta

6

Si no le importa la excepción (es decir, no es una "excepción", es el procedimiento operativo habitual y ocurre siempre), puede simplemente ignorarla/suprimirla. (Siempre que no ocurra en una situación que indique un error real)

Si desea suprimirlo de forma más ordenada, puede establecer un indicador que indique a su devolución de llamada que debe cerrarse, y la devolución de llamada hace el cierre/eliminación del zócalo. De esta manera, puede garantizar que no haya lecturas pendientes en el socket y no recibirá la excepción (pero esto significa que se suspenderá indefinidamente, hasta que se reciba otro paquete, lo que por supuesto nunca sucederá).

Si tiene el control de ambos extremos del enlace de comunicaciones, puede enviar un mensaje de "cierre" explícito que le dice al cliente que la conexión debe cerrarse (y esto puede aplicarse en la devolución de llamada cuando mensaje es recibido).

(Pero me gustaría saber si alguien más ha encontrado una mejor solución ya que tengo una situación similar con una aplicación de comunicaciones UDP)

+0

(Siempre que no ocurra en una situación que indique un error real) -> sí, no puedo estar seguro de esto. También estoy interesado en saber más sobre las opiniones de los demás. sí, estoy escribiendo cliente y servidor en este caso. Siempre estoy por código ordenado en lugar de código que simplemente funciona. – iTEgg

1

Here is a fair solution. Sin embargo, esperaba que el marco proporcionara soporte para esto, es decir, después de cerrar al cliente la devolución de llamada de recepción para que no se vuelva a llamar.

Cuestiones relacionadas