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