[C#] vlákna & tcp

Zdravím,
dělám si vlastní dvojici aplikací Klient - Server. Momentálně se zabývám Klientem (realizován jako vlastní třída) - jeho úkolem je připojit se k serveru a dle příkazů uživatele s ním komunikovat. Zároveň ale musím být schopen příjimat náhodně (pseudo) zprávy ze strany serveru.
Abych tohoto docílil, přímo v klientu si vytvořím druhé vlákno - jeho úkolem je právě čekat na náhodné zprávy ze strany serveru a zpracovat je.
Klienta používám ve Form aplikaci - už. klikne a Klient pošle zprávu serveru a čeká na odpověď.
A tady nastává můj problém (či neznalost) - jelikož už mi na zprávy od serveru čeká druhé vlákno, nevím jak docílit toho, aby odpověď na právě zaslaný dotaz přišlo stávajícímu vkláknu (a ne tomu druhému) - abych mohl na odpověď zareagovat a vrátit se z metody.
Napadlo mě to udělat pomocí Mutexů - viz ukázka:
Toto je kód druhého vlákna
toto je kód volané metody, která musí být sycnhroní (vrací výsledek volání)
(TcpMessage je moje vlastní třída, zde nemá význam)
Můj nápad byl takový - v druhém vlákně nastavím timeout na půl sekundy a budu volat stále dokola ReadLine(). Pokud se zavolá metoda SendMessage(), spustí se Mutex, ten počká dokud ho druhé vlákno neuvolní (max. půl sekundy), vstoupí se do chráněného kódu (druhé vlákno se ve while smyčce zastaví na Mutexu), zde se pošlou a přijmou data, uvolní se Mutex a vrátí se výsledek - tím je zajištěno, že je tato metoda synchroní.
Problém je v tom, že při TimeOutu v druhém vlákně dojde k odpojení klienta - na čemž moje řešní padá.
Nevíte jak toto ošetřit (aby při timeoutu nedošlo k odpojení od serveru)? Případně úplně jiný způsob, jak vyřešit asycnhronní příjem zpráv od serveru kombinovaný se synchroními voláními?
dělám si vlastní dvojici aplikací Klient - Server. Momentálně se zabývám Klientem (realizován jako vlastní třída) - jeho úkolem je připojit se k serveru a dle příkazů uživatele s ním komunikovat. Zároveň ale musím být schopen příjimat náhodně (pseudo) zprávy ze strany serveru.
Abych tohoto docílil, přímo v klientu si vytvořím druhé vlákno - jeho úkolem je právě čekat na náhodné zprávy ze strany serveru a zpracovat je.
Klienta používám ve Form aplikaci - už. klikne a Klient pošle zprávu serveru a čeká na odpověď.
A tady nastává můj problém (či neznalost) - jelikož už mi na zprávy od serveru čeká druhé vlákno, nevím jak docílit toho, aby odpověď na právě zaslaný dotaz přišlo stávajícímu vkláknu (a ne tomu druhému) - abych mohl na odpověď zareagovat a vrátit se z metody.
Napadlo mě to udělat pomocí Mutexů - viz ukázka:
Toto je kód druhého vlákna
- Kód: Vybrat vše
tcpReader.BaseStream.ReadTimeout = 500;
while (! stopListening)
{
readMutex.WaitOne();
try
{
string msg = tcpReader.ReadLine();
TcpMessage tmsg = new TcpMessage(msg);
}
catch
{
if (!tcpClient.Connected)
{
stopListening = true;
MessageBox.Show("Not connected anymore");
}
}
readMutex.ReleaseMutex();
}
toto je kód volané metody, která musí být sycnhroní (vrací výsledek volání)
- Kód: Vybrat vše
private TcpMessage SendMessage(TcpMessage message)
{
readMutex.WaitOne(); // wait until doListening stops listening
tcpWriter.WriteLine(message.ToString());
TcpMessage res = new TcpMessage(tcpReader.ReadLine());
readMutex.ReleaseMutex();
return res;
}
(TcpMessage je moje vlastní třída, zde nemá význam)
Můj nápad byl takový - v druhém vlákně nastavím timeout na půl sekundy a budu volat stále dokola ReadLine(). Pokud se zavolá metoda SendMessage(), spustí se Mutex, ten počká dokud ho druhé vlákno neuvolní (max. půl sekundy), vstoupí se do chráněného kódu (druhé vlákno se ve while smyčce zastaví na Mutexu), zde se pošlou a přijmou data, uvolní se Mutex a vrátí se výsledek - tím je zajištěno, že je tato metoda synchroní.
Problém je v tom, že při TimeOutu v druhém vlákně dojde k odpojení klienta - na čemž moje řešní padá.
Nevíte jak toto ošetřit (aby při timeoutu nedošlo k odpojení od serveru)? Případně úplně jiný způsob, jak vyřešit asycnhronní příjem zpráv od serveru kombinovaný se synchroními voláními?