|
@@ -4,6 +4,7 @@ using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
+using Expressive;
|
|
|
using InABox.Clients;
|
|
|
using InABox.Core;
|
|
|
using WebSocket4Net;
|
|
@@ -130,10 +131,19 @@ namespace InABox.Rpc
|
|
|
client.DataReceived += Client_DataReceived;
|
|
|
client.Open();
|
|
|
|
|
|
- openEvent.Wait(ct);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ openEvent.Wait(ct);
|
|
|
+ }
|
|
|
+ catch (TaskCanceledException)
|
|
|
+ {
|
|
|
+ client.Dispose();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
if (!open)
|
|
|
{
|
|
|
+ client.Dispose();
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -220,11 +230,13 @@ namespace InABox.Rpc
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ var childCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
|
|
+
|
|
|
var tasks = new List<Task<WebSocket?>>();
|
|
|
foreach (var url in _urls)
|
|
|
{
|
|
|
- tasks.Add(Task.Run(() => CreateSocket(url, true, ct)));
|
|
|
- tasks.Add(Task.Run(() => CreateSocket(url, false, ct)));
|
|
|
+ tasks.Add(Task.Run(() => CreateSocket(url, true, childCts.Token)));
|
|
|
+ tasks.Add(Task.Run(() => CreateSocket(url, false, childCts.Token)));
|
|
|
}
|
|
|
while (tasks.Count > 0)
|
|
|
{
|
|
@@ -233,6 +245,7 @@ namespace InABox.Rpc
|
|
|
tasks.Remove(result);
|
|
|
else
|
|
|
{
|
|
|
+ childCts.Cancel();
|
|
|
_socket = result.Result;
|
|
|
_connected = true;
|
|
|
|