Mam klasę serwera, która zasadniczo czeka na połączenia od klienta. Wewnątrz tej klasy tworzę obiekt NetworkStream, aby móc odbierać bajty od klienta. Ponieważ metoda NetworkStream.Read() nie jest asynchroniczna (co oznacza, że będzie czekała aż odczyta bajty od klienta, aby kontynuować wykonywanie kodu podobnego do metody skrzynki komunikatów), muszę przeczytać bajty w osobnym wątku, aby użytkownik korzystający z programu może nadal wchodzić w interakcję z programem, jeśli program czeka na odczyt danych.Obiekt dostępu z innego wątku
mimo to wiele rzeczy jest własnością tego wątku. Jednym z przykładów jest to, że mam listę o nazwie log w tej klasie. Używam tej listy, aby poznać status serwera. Może to jest słuchanie połączenia lub może jego status jest "podłączony" lub "odłączony".
Więc jeśli mam coś takiego:
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.
bo chcę wiedzieć, kiedy dziennik jest aktualizowany, na klasie serwera Stworzyłem zdarzenie jako:
public delegate void onUpdateHandler(string newStatus);
public event onUpdateHandler onUpdate = delegate { };
Potem przeciwpożarowej wydarzenia na klasie serwera jako:
onUpdate("waitingForConnection");
i otrzymują te zdarzenia za pomocą metody:
ale gdy próbuję coś zrobić z NEWSTATUS otrzymuję błąd stwierdzając:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
więc jak mogę przekazać obiekt ze zdarzeniem?
Edit
więc również zauważyć, że jeśli to zrobię:
ja również się błąd!
ale kiedy robię to samo wzywającą że z guzika jak:
// SERVER IS RUNNING BEFORE CALLING THIS METHOD
private void button3_Click(object sender, RoutedEventArgs e)
{
listView1.Items.Add("my own string");
}
nie pojawia się błąd!
Dlaczego jest to, że dostaję błąd z wydarzeniem i nie dostaję błędu podczas wywoływania go za pomocą zwykłego przycisku.
kiedy miejsce to wewnątrz w mojej metodzie pojawia się komunikat o błędzie: Nie można przekonwertować wyrażenia lambda na typ "System.Delegate", ponieważ nie jest to delegat typu –
@TonoNam: Oh tak, musisz go rzucić lub utworzyć akcję jawnie. –
@Tono, lambda musi zostać przeniesiona do jakiegoś typu delegata, zobacz moją edycję. – svick