public async Task <bool> Ping(byte[] opaqueData, CancellationToken cancelToken) { if (opaqueData == null || opaqueData.Length <= 0) { throw new ArgumentNullException("opaqueData"); } await connection.Connect(); var semaphoreWait = new SemaphoreSlim(0); var opaqueDataMatch = false; var connectionStream = await streamManager.Get(0); Http2Stream.FrameReceivedDelegate frameRxAction; frameRxAction = new Http2Stream.FrameReceivedDelegate(frame => { var pf = frame as PingFrame; if (pf != null) { opaqueDataMatch = pf.Ack && pf.OpaqueData != null && pf.OpaqueData.SequenceEqual(opaqueData); semaphoreWait.Release(); } }); // Wire up the event to listen for ping response connectionStream.OnFrameReceived += frameRxAction; // Construct ping request var pingFrame = new PingFrame(); pingFrame.OpaqueData = new byte[opaqueData.Length]; opaqueData.CopyTo(pingFrame.OpaqueData, 0); // Send ping await connection.QueueFrame(pingFrame); // Wait for either a ping response or timeout await semaphoreWait.WaitAsync(cancelToken); // Cleanup the event connectionStream.OnFrameReceived -= frameRxAction; return(opaqueDataMatch); }
public async Task<bool> Ping (byte[] opaqueData, CancellationToken cancelToken) { if (opaqueData == null || opaqueData.Length <= 0) throw new ArgumentNullException ("opaqueData"); await connection.Connect (); var semaphoreWait = new SemaphoreSlim (0); var opaqueDataMatch = false; var connectionStream = await streamManager.Get (0); Http2Stream.FrameReceivedDelegate frameRxAction; frameRxAction = new Http2Stream.FrameReceivedDelegate (frame => { var pf = frame as PingFrame; if (pf != null) { opaqueDataMatch = pf.Ack && pf.OpaqueData != null && pf.OpaqueData.SequenceEqual (opaqueData); semaphoreWait.Release (); } }); // Wire up the event to listen for ping response connectionStream.OnFrameReceived += frameRxAction; // Construct ping request var pingFrame = new PingFrame (); pingFrame.OpaqueData = new byte[opaqueData.Length]; opaqueData.CopyTo (pingFrame.OpaqueData, 0); // Send ping await connection.QueueFrame (pingFrame); // Wait for either a ping response or timeout await semaphoreWait.WaitAsync (cancelToken); // Cleanup the event connectionStream.OnFrameReceived -= frameRxAction; return opaqueDataMatch; }