// по получении ответа 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); }
//обработать картинку public void ProcessImage(Bitmap image, int filterID, OnImageProcessed onImageProcessed) { this.onImageProcessed = onImageProcessed; if (Workers.Count == 0) { MessageBox.Show("App must contains at least 1 peer", "Error"); } else { //высчитываем смещение, сколько частей будем ждать и тд int[] imageArray = GetImageArray(image); ArrayTempBuffer = imageArray; int workerOffset = imageArray.Length / Workers.Count; PartsRemained = Workers.Count; Offset = workerOffset; int counter = 0; // для каждого пира foreach (PeerBaseContainer peer in Workers) { //создаём сообщение ImageProcessingMessage message = new ImageProcessingMessage(counter++, filterID, image.Height, image.Width, workerOffset, imageArray); //асинхронно отправляем его Task.Factory.StartNew(() => peer.SendMessage(message)); //асинхронно ожидаем ответа peer.Client.GetStream().BeginRead(peer.Buffer, 0, 4, OnReadFromNetworkStream, peer); } } }
static void Main(string[] args) { ImagePeerService peerService = new ImagePeerService(); while (!peerService.IsConnected) { peerService.TryToConnect(EndPoint); Console.WriteLine($"Appointed GUID: {peerService.Guid}"); } while (true) { ImageProcessingMessage message = peerService.WaitForMessage(); ZeroNeighborsSharedFilter filter = ZeroNeighborsSharedFilter.GetFilterByID(message.FilterID); for (int i = 0; i < message.ImageArray.Length; i++) { message.ImageArray[i] = filter.Filter(message.ImageArray[i]); } peerService.SendMessage(message); } }