// по получении ответа private void OnReadFromNetworkStream(IAsyncResult result) { PeerBaseContainer peer = result.AsyncState as PeerBaseContainer; int msgLength = BitConverter.ToInt32(peer.Buffer, 0); peer.Client.GetStream().Read(peer.Buffer, 0, msgLength); //читаем обработанное сообщение ImageProcessingMessage msg = new ImageProcessingMessage(peer.Buffer, msgLength); //присваиваем значения в соответствии с workID и смещением for (int i = 0; i < msg.ImageArray.Length; i++) { ArrayTempBuffer[i + (msg.WorkID * Offset)] = msg.ImageArray[i]; } //декремент переменной оставшихся частей if (onDecrement.WaitOne()) { PartsRemained--; //если это последняя часть if (PartsRemained == 0) { //вызываем делегат onImageProcessed(ArrayTempBuffer); } onDecrement.ReleaseMutex(); } //завершаем чтение peer.Client.GetStream().EndRead(result); }
//начинаем слушать в отдельной нити private async void Startup() { Listener.Start(); while (true) { TcpClient client = await Listener.AcceptTcpClientAsync(); if (mutex.WaitOne()) { PeerBaseContainer newSlave = new PeerBaseContainer(Guid.NewGuid(), client); byte[] bytes = newSlave.Guid.ToByteArray(); newSlave.Client.GetStream().Write(bytes, 0, bytes.Length); Workers.Add(newSlave); mutex.ReleaseMutex(); } } }