private async void OnBlockSendReceived(
     BlockSendArgs blockSendArgs
 )
 {
     try
     {
         using (_stateHelper.GetFuncWrapper())
         {
             string fromDestination = blockSendArgs.Destination;
             if (_dropDestinations.Contains(fromDestination))
                 return;
             if (!SamHelper.IsDestinationStringValid(fromDestination))
                 return;
             DestinationInfo destinationInfo;
             using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false))
             {
                 if (
                     !_destinationDb.ContainsKey(
                         blockSendArgs.Destination
                         )
                     )
                     return;
                 destinationInfo
                     = _destinationDb[blockSendArgs.Destination];
             }
             InMessageInfo inMessageInfo;
             using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false))
             {
                 if (
                     !destinationInfo.InMessagesDb.ContainsKey(
                         blockSendArgs.MessageId
                     )
                 )
                     return;
                 inMessageInfo
                     = destinationInfo.InMessagesDb[
                         blockSendArgs.MessageId
                     ];
             }
             if (
                 inMessageInfo.Status
                 == InMessageStatus.AllBlocksReceived
             )
                 return;
             if (inMessageInfo.BlockCount > 1)
             {
                 await SendBlockConfirmation(
                     fromDestination,
                     blockSendArgs.MessageId,
                     blockSendArgs.BlockId
                 ).ConfigureAwait(false);
             }
             if (
                 await inMessageInfo.ReceiveBlock(
                     blockSendArgs.BlockId,
                     blockSendArgs.BlockData
                 ).ConfigureAwait(false)
             )
             {
                 var allData = new List<byte>(
                     (int) inMessageInfo.MessageSize
                 );
                 foreach (
                     byte[] blockData 
                         in inMessageInfo.ReceivedData
                     )
                 {
                     allData.AddRange(blockData);
                 }
                 var dataArray = allData.ToArray();
                 if (
                     inMessageInfo.MessageHash.SequenceEqual(
                         GetMessageHash(
                             blockSendArgs.MessageId,
                             inMessageInfo.ReplyToMessageId,
                             inMessageInfo.MessageKind,
                             dataArray
                             )
                         )
                     )
                 {
                     ReliableMessageReceived.OnNext(
                         new ReliableMessageReceivedArgs()
                         {
                             Destination = fromDestination,
                             Data = allData.ToArray(),
                             MessageId = blockSendArgs.MessageId,
                             ReplyToMessageId
                                 = inMessageInfo.ReplyToMessageId,
                             MessageKind = inMessageInfo.MessageKind
                         }
                     );
                 }
                 await inMessageInfo.FlushBlocks().ConfigureAwait(false);
             }
         }
     }
     catch (OperationCanceledException)
     {
     }
     catch (WrongDisposableObjectStateException)
     {
     }
     catch (Exception exc)
     {
         _log.Error(
             "OnBlockSendReceived" +
                 " unexpected error '{0}'",
             exc.ToString()
         );
     }
 }
 private async void OnBlockSendReceived(
     BlockSendArgs blockSendArgs
     )
 {
     try
     {
         using (_stateHelper.GetFuncWrapper())
         {
             string fromDestination = blockSendArgs.Destination;
             if (_dropDestinations.Contains(fromDestination))
             {
                 return;
             }
             if (!SamHelper.IsDestinationStringValid(fromDestination))
             {
                 return;
             }
             DestinationInfo destinationInfo;
             using (await _destinationDbLockSem.GetDisposable().ConfigureAwait(false))
             {
                 if (
                     !_destinationDb.ContainsKey(
                         blockSendArgs.Destination
                         )
                     )
                 {
                     return;
                 }
                 destinationInfo
                     = _destinationDb[blockSendArgs.Destination];
             }
             InMessageInfo inMessageInfo;
             using (await destinationInfo.InMessagesDbLockSem.GetDisposable().ConfigureAwait(false))
             {
                 if (
                     !destinationInfo.InMessagesDb.ContainsKey(
                         blockSendArgs.MessageId
                         )
                     )
                 {
                     return;
                 }
                 inMessageInfo
                     = destinationInfo.InMessagesDb[
                           blockSendArgs.MessageId
                       ];
             }
             if (
                 inMessageInfo.Status
                 == InMessageStatus.AllBlocksReceived
                 )
             {
                 return;
             }
             if (inMessageInfo.BlockCount > 1)
             {
                 await SendBlockConfirmation(
                     fromDestination,
                     blockSendArgs.MessageId,
                     blockSendArgs.BlockId
                     ).ConfigureAwait(false);
             }
             if (
                 await inMessageInfo.ReceiveBlock(
                     blockSendArgs.BlockId,
                     blockSendArgs.BlockData
                     ).ConfigureAwait(false)
                 )
             {
                 var allData = new List <byte>(
                     (int)inMessageInfo.MessageSize
                     );
                 foreach (
                     byte[] blockData
                     in inMessageInfo.ReceivedData
                     )
                 {
                     allData.AddRange(blockData);
                 }
                 var dataArray = allData.ToArray();
                 if (
                     inMessageInfo.MessageHash.SequenceEqual(
                         GetMessageHash(
                             blockSendArgs.MessageId,
                             inMessageInfo.ReplyToMessageId,
                             inMessageInfo.MessageKind,
                             dataArray
                             )
                         )
                     )
                 {
                     ReliableMessageReceived.OnNext(
                         new ReliableMessageReceivedArgs()
                     {
                         Destination = fromDestination,
                         Data        = allData.ToArray(),
                         MessageId   = blockSendArgs.MessageId,
                         ReplyToMessageId
                                     = inMessageInfo.ReplyToMessageId,
                         MessageKind = inMessageInfo.MessageKind
                     }
                         );
                 }
                 await inMessageInfo.FlushBlocks().ConfigureAwait(false);
             }
         }
     }
     catch (OperationCanceledException)
     {
     }
     catch (WrongDisposableObjectStateException)
     {
     }
     catch (Exception exc)
     {
         _log.Error(
             "OnBlockSendReceived" +
             " unexpected error '{0}'",
             exc.ToString()
             );
     }
 }