Repository navigation
Expand file tree
/
Copy pathProgram.cs
More file actions
66 lines (57 loc) · 1.8 KB
/
Copy pathProgram.cs
File metadata and controls
66 lines (57 loc) · 1.8 KB
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
using System.Net;
using QuickStart.Contracts;
using SharpLink.Server;
using SharpLink.Sdk;
[assembly: SharpLinkRpcContracts(typeof(IGreetingService))]
const int port = 50051;
var runOnce = args.Contains("--once", StringComparer.Ordinal);
var stopRequested = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
ConsoleCancelEventHandler cancelHandler = (_, e) =>
{
e.Cancel = true;
stopRequested.TrySetResult();
};
Console.CancelKeyPress += cancelHandler;
try
{
await using var server = SharpLinkServerBuilder.Create()
.UseTcp(port, IPAddress.Loopback)
.Build();
await server.StartAsync();
var terminal = server.WaitForShutdownAsync();
Console.WriteLine($"QUICKSTART_SERVER_READY http=127.0.0.1:{port}");
var requestedStop = runOnce ? QuickStartState.FirstCallCompleted.Task : stopRequested.Task;
var completed = await Task.WhenAny(terminal, requestedStop);
if (completed == terminal)
{
await terminal;
}
else
{
await server.StopAsync(TimeSpan.FromSeconds(5));
await terminal;
}
Console.WriteLine("QUICKSTART_SERVER_STOPPED");
}
finally
{
Console.CancelKeyPress -= cancelHandler;
}
[RpcService]
public sealed class GreetingService : IGreetingService
{
public ValueTask<GreetingReply> GreetAsync(
GreetingRequest request,
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
var reply = new GreetingReply { Message = $"Hello, {request.Name}!" };
QuickStartState.FirstCallCompleted.TrySetResult();
return ValueTask.FromResult(reply);
}
}
internal static class QuickStartState
{
internal static TaskCompletionSource FirstCallCompleted { get; } =
new(TaskCreationOptions.RunContinuationsAsynchronously);
}