Mam wątek pracownika w mojej aplikacji, który jest odpowiedzialny za trzy różne rzeczy. Żądania dwóch zadań pojawiają się w kolejkach, które napisałem, drugie zadanie jest aktywowane, gdy żądanie pojawia się w strumieniu sieci. Chciałbym, aby moja wątek roboczy czekał, kiedy nie ma pracy do wykonania. Jest to łatwe w przypadku dwóch kolejek, ponieważ eksponują one ManualResetEvent, który jest ustawiony, gdy mają elementy, jednak wydaje się, że NetworkStream nie ma tego. Obiekt NetworkStream został pobrany z TcpClient.Jak czekasz, aż strumień sieciowy odczyta dane?
Co Jestem po to kod, który wygląda mniej więcej tak:
while (notDone)
{
WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData });
// ...
if (netStream.DataAvailable)
{
netStream.Read(buffer, 0, 20);
// process buffer
}
}
Czy ktoś zna sposób, aby uzyskać WaitHandle który jest ustawiony, gdy NetworkStream ma danych?
Czy to możliwe, aby uzyskać BeginRead czytać bajtów zerowych? –
Jeśli zdalny host zamknie połączenie, a nie ma już dostępnych danych, zostanie odczytanych 0 bajtów. Dlaczego pytasz? – SpaceghostAli
Jeśli nie możesz ustawić BeginRead na zero bajtów, musisz zacząć zarządzać buforem odczytu między główną pętlą a oddzwonieniem. Jest to całkowicie wykonalne, ale nie jest tak ładne, jak bym chciał. –