diff --git a/source/ChromeDevTools/ChromeSession.cs b/source/ChromeDevTools/ChromeSession.cs
index 087c4d5dae6500a1d7458c6d29285a0ae8ef226f..bb6ad0fc9e108bde148b6666fc66bdd977a78f18 100644
--- a/source/ChromeDevTools/ChromeSession.cs
+++ b/source/ChromeDevTools/ChromeSession.cs
@@ -17,7 +17,7 @@ namespace MasterDevs.ChromeDevTools
         private IEventFactory _eventFactory;
         private ManualResetEvent _openEvent = new ManualResetEvent(false);
         private ManualResetEvent _publishEvent = new ManualResetEvent(false);
-        private ConcurrentDictionary<long, ManualResetEvent> _requestWaitHandles = new ConcurrentDictionary<long, ManualResetEvent>();
+        private ConcurrentDictionary<long, ManualResetEventSlim> _requestWaitHandles = new ConcurrentDictionary<long, ManualResetEventSlim>();
         private ICommandResponseFactory _responseFactory;
         private ConcurrentDictionary<long, ICommandResponse> _responses = new ConcurrentDictionary<long, ICommandResponse>();
         private WebSocket _webSocket;
@@ -73,16 +73,16 @@ namespace MasterDevs.ChromeDevTools
             });
         }
 
-        public Task<ICommandResponse> SendAsync<T>()
+        public Task<ICommandResponse> SendAsync<T>(CancellationToken cancellationToken)
         {
             var command = _commandFactory.Create<T>();
-            return SendCommand(command);
+            return SendCommand(command, cancellationToken);
         }
 
-        public Task<ICommandResponse> SendAsync<T>(T parameter)
+        public Task<ICommandResponse> SendAsync<T>(T parameter, CancellationToken cancellationToken)
         {
             var command = _commandFactory.Create(parameter);
-            return SendCommand(command);
+            return SendCommand(command, cancellationToken);
         }
 
         public void Subscribe<T>(Action<T> handler) where T : class
@@ -136,7 +136,7 @@ namespace MasterDevs.ChromeDevTools
         private void HandleResponse(ICommandResponse response)
         {
             if (null == response) return;
-            ManualResetEvent requestMre;
+            ManualResetEventSlim requestMre;
             if (_requestWaitHandles.TryGetValue(response.Id, out requestMre))
             {
                 _responses.AddOrUpdate(response.Id, id => response, (key, value) => response);
@@ -156,7 +156,7 @@ namespace MasterDevs.ChromeDevTools
             }
         }
 
-        private Task<ICommandResponse> SendCommand(Command command)
+        private Task<ICommandResponse> SendCommand(Command command, CancellationToken cancellationToken)
         {
             var settings = new JsonSerializerSettings
             {
@@ -164,13 +164,13 @@ namespace MasterDevs.ChromeDevTools
                 NullValueHandling = NullValueHandling.Ignore,
             };
             var requestString = JsonConvert.SerializeObject(command, settings);
-            var requestResetEvent = new ManualResetEvent(false);
+            var requestResetEvent = new ManualResetEventSlim(false);
             _requestWaitHandles.AddOrUpdate(command.Id, requestResetEvent, (id, r) => requestResetEvent);
             return Task.Run(() =>
             {
                 EnsureInit();
                 _webSocket.Send(requestString);
-                requestResetEvent.WaitOne();
+                requestResetEvent.Wait(cancellationToken);
                 ICommandResponse response = null;
                 _responses.TryRemove(command.Id, out response);
                 _requestWaitHandles.TryRemove(command.Id, out requestResetEvent);
diff --git a/source/ChromeDevTools/ChromeSessionExtensions.cs b/source/ChromeDevTools/ChromeSessionExtensions.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b0817f80c44879ea185aa619e559729877620097
--- /dev/null
+++ b/source/ChromeDevTools/ChromeSessionExtensions.cs
@@ -0,0 +1,18 @@
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MasterDevs.ChromeDevTools
+{
+    public static class ChromeSessionExtensions
+    {
+        public static Task<ICommandResponse> SendAsync<T>(this IChromeSession session, T parameter)
+        {
+            return session.SendAsync<T>(parameter, CancellationToken.None);
+        }
+
+        public static Task<ICommandResponse> SendAsync<T>(this IChromeSession session)
+        {
+            return session.SendAsync<T>(CancellationToken.None);
+        }
+    }
+}
diff --git a/source/ChromeDevTools/IChromeSession.cs b/source/ChromeDevTools/IChromeSession.cs
index 7840557a68811877ad1ca0b38799043bb36196be..e5ae25f6e9b0497ef15f1aa17652f5146ae3162b 100644
--- a/source/ChromeDevTools/IChromeSession.cs
+++ b/source/ChromeDevTools/IChromeSession.cs
@@ -1,13 +1,14 @@
 using System;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MasterDevs.ChromeDevTools
 {
     public interface IChromeSession
     {
-        Task<ICommandResponse> SendAsync<T>(T parameter);
+        Task<ICommandResponse> SendAsync<T>(T parameter, CancellationToken cancellationToken);
 
-        Task<ICommandResponse> SendAsync<T>();
+        Task<ICommandResponse> SendAsync<T>(CancellationToken cancellationToken);
 
         void Subscribe<T>(Action<T> handler) where T : class;
     }
diff --git a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
index c8c40e0002b9fbb8417172315a19559d640a0dcc..46662a54167e84561e78ffc2da90f4d9227370c8 100644
--- a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
+++ b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj
@@ -50,6 +50,7 @@
     <Compile Include="ChromeProcessFactory.cs" />
     <Compile Include="ChromeProcess.cs" />
     <Compile Include="ChromeSession.cs" />
+    <Compile Include="ChromeSessionExtensions.cs" />
     <Compile Include="ChromeSessionFactory.cs" />
     <Compile Include="Command.cs" />
     <Compile Include="CommandAttribute.cs" />