mirror of
				https://github.com/JKorf/CryptoExchange.Net
				synced 2025-10-31 10:27:48 +00:00 
			
		
		
		
	Threadsafe fix for socket open/close
This commit is contained in:
		
							parent
							
								
									b5833e5230
								
							
						
					
					
						commit
						1e83c2ded4
					
				| @ -7,7 +7,7 @@ | ||||
|   <PropertyGroup> | ||||
|     <PackageId>CryptoExchange.Net</PackageId> | ||||
| 	<Authors>JKorf</Authors> | ||||
|     <PackageVersion>0.0.41</PackageVersion> | ||||
|     <PackageVersion>0.0.42</PackageVersion> | ||||
| 	<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> | ||||
|     <PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl> | ||||
| 	<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl> | ||||
|  | ||||
| @ -104,13 +104,23 @@ namespace CryptoExchange.Net.Implementation | ||||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     var waitLock = new object(); | ||||
|                     log.Write(LogVerbosity.Debug, "Closing websocket"); | ||||
|                     ManualResetEvent evnt = new ManualResetEvent(false); | ||||
|                     var handler = new EventHandler((o, a) => evnt.Set()); | ||||
|                     var handler = new EventHandler((o, a) => | ||||
|                     { | ||||
|                         lock(waitLock) | ||||
|                             evnt?.Set(); | ||||
|                     }); | ||||
|                     socket.Closed += handler; | ||||
|                     socket.Close(); | ||||
|                     evnt.WaitOne(3000); | ||||
|                     evnt.WaitOne(2000); | ||||
|                     lock (waitLock) | ||||
|                     { | ||||
|                         socket.Closed -= handler; | ||||
|                         evnt.Dispose(); | ||||
|                         evnt = null; | ||||
|                     } | ||||
|                     log.Write(LogVerbosity.Debug, "Websocket closed"); | ||||
|                 } | ||||
|             }).ConfigureAwait(false); | ||||
| @ -129,24 +139,32 @@ namespace CryptoExchange.Net.Implementation | ||||
|                 lock (socketLock) | ||||
|                 { | ||||
|                     log.Write(LogVerbosity.Debug, "Connecting websocket"); | ||||
|                     var waitLock = new object(); | ||||
|                     ManualResetEvent evnt = new ManualResetEvent(false); | ||||
|                     var handler = new EventHandler((o, a) => evnt?.Set()); | ||||
|                     var errorHandler = new EventHandler<ErrorEventArgs>((o, a) => evnt?.Set()); | ||||
|                     var errorHandler = new EventHandler<ErrorEventArgs>((o, a) => | ||||
|                     { | ||||
|                         lock(waitLock) | ||||
|                             evnt?.Set(); | ||||
|                     }); | ||||
|                     socket.Opened += handler; | ||||
|                     socket.Closed += handler; | ||||
|                     socket.Error += errorHandler; | ||||
|                     socket.Open(); | ||||
|                     evnt.WaitOne(TimeSpan.FromSeconds(15)); | ||||
|                     lock (waitLock) | ||||
|                     { | ||||
|                         socket.Opened -= handler; | ||||
|                         socket.Closed -= handler; | ||||
|                         socket.Error -= errorHandler; | ||||
|                         evnt.Dispose(); | ||||
|                         evnt = null; | ||||
|                     } | ||||
|                     connected = socket.State == WebSocketState.Open; | ||||
|                     if (connected) | ||||
|                         log.Write(LogVerbosity.Debug, "Websocket connected"); | ||||
|                     else | ||||
|                         log.Write(LogVerbosity.Debug, "Websocket connection failed, state: " + socket.State); | ||||
|                     evnt.Dispose(); | ||||
|                     evnt = null; | ||||
|                 } | ||||
| 
 | ||||
|                 if (socket.State == WebSocketState.Connecting) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user