Tengo una clase de servidor que básicamente espera las conexiones de un cliente. Dentro de esa clase creo un objeto NetworkStream para poder recibir bytes de un cliente. Como el método NetworkStream.Read() no es asíncrono (lo que significa que esperará hasta que lea bytes de un cliente para continuar ejecutando código similar al método messagebox), tendré que leer los bytes en un hilo separado para que el el usuario que usa el programa aún puede interactuar con el programa si el programa está esperando a leer datos.objeto de acceso desde un hilo diferente
de todos modos un montón de objetos son propiedad de ese hilo. Un ejemplo es que tengo una lista llamada iniciar sesión en esa clase. Utilizo esa lista para conocer el estado del servidor. Tal vez está escuchando una conexión o tal vez su estado está "conectado" o "desconectado".
Así que si hago algo como:
Server myServer = new Server("192.168.0.120","1300"...\\ I pass the appropite parameters in order to instantiate it
//...
.. then I am able to latter look at the log as
string foo = myServer.Log[0] for example.
porque quiero saber cuando se actualiza el registro, en el servidor de clase I se ha creado un evento como:
public delegate void onUpdateHandler(string newStatus);
public event onUpdateHandler onUpdate = delegate { };
entonces el fuego eventos en la clase de servidor como:
onUpdate("waitingForConnection");
y recibo esos eventos con el método:
pero si trato de hacer algo con nuevoCondición recibo indicando el error:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
así que ¿cómo puedo pasar un objeto con un evento?
Editar
así que también cuenta de que si lo hago:
también consigo un error!
pero cuando lo haga lo mismo que llamar desde un botón como:
// SERVER IS RUNNING BEFORE CALLING THIS METHOD
private void button3_Click(object sender, RoutedEventArgs e)
{
listView1.Items.Add("my own string");
}
No consigo un error!
por qué es que me sale un error con el evento y no aparece un error al llamarlo con un botón normal.
cuando coloco que en el interior mi método me da un error que dice: No se puede convertir la expresión lambda para escribir 'System.Delegate' porque no es un tipo de delegado –
@TonoNam: Oh sí, tienes que lanzarlo, o crear una acción explícitamente. –
@Tono, el lambda tiene que ser enviado a algún tipo de delegado, ver mi edición. – svick