forked from Azure/azure-signalr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
108 lines (93 loc) · 3.21 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Azure.SignalR;
namespace ChatSample.CSharpClient
{
class Program
{
static async Task Main(string[] args)
{
var url = "http://localhost:5050";
var proxy = await ConnectAsync(url + "/chat", Console.Out);
var currentUser = Guid.NewGuid().ToString("N");
Mode mode = Mode.Broadcast;
if (args.Length > 0)
{
Enum.TryParse(args[0], true, out mode);
}
Console.WriteLine($"Logged in as user {currentUser}");
var input = Console.ReadLine();
while (!string.IsNullOrEmpty(input))
{
switch (mode)
{
case Mode.Broadcast:
await proxy.InvokeAsync("BroadcastMessage", currentUser, input);
break;
case Mode.Echo:
await proxy.InvokeAsync("echo", input);
break;
default:
break;
}
input = Console.ReadLine();
}
}
private static async Task<HubConnection> ConnectAsync(string url, TextWriter output, CancellationToken cancellationToken = default)
{
var connection = new HubConnectionBuilder().WithUrl(url).Build();
connection.On<string, string>("BroadcastMessage", BroadcastMessage);
connection.On<string>("Echo", Echo);
connection.Closed += async (e) =>
{
output.WriteLine(e);
await DelayRandom(200, 1000);
await StartAsyncWithRetry(connection, output, cancellationToken);
};
await StartAsyncWithRetry(connection, output, cancellationToken);
return connection;
}
private static async Task StartAsyncWithRetry(HubConnection connection, TextWriter output, CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
try
{
await connection.StartAsync(cancellationToken);
return;
}
catch (Exception e)
{
output.WriteLine($"Error starting: {e.Message}, retry...");
await DelayRandom(200, 1000);
}
}
}
/// <summary>
/// Delay random milliseconds
/// </summary>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
private static Task DelayRandom(int min, int max)
{
return Task.Delay(StaticRandom.Next(min, max));
}
private static void BroadcastMessage(string name, string message)
{
Console.WriteLine($"{name}: {message}");
}
private static void Echo(string message)
{
Console.WriteLine(message);
}
private enum Mode
{
Broadcast,
Echo,
}
}
}