1 // Assembly location: C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.1\Microsoft.Extensions.Hosting.Abstractions.dll
2
3 using Microsoft.Extensions.DependencyInjection;
4 using System;
5 using System.Threading;
6 using System.Threading.Tasks;
7
8 namespace Microsoft.Extensions.Hosting
9 {
10 public static class HostingAbstractionsHostExtensions
11 {
12 public static void Start(this IHost host)
13 {
14 host.StartAsync(new CancellationToken()).GetAwaiter().GetResult();
15 }
16
17 public static Task StopAsync(this IHost host, TimeSpan timeout)
18 {
19 return host.StopAsync(new CancellationTokenSource(timeout).Token);
20 }
21
22 public static void WaitForShutdown(this IHost host)
23 {
24 host.WaitForShutdownAsync(new CancellationToken()).GetAwaiter().GetResult();
25 }
26
27 public static void Run(this IHost host)
28 {
29 host.RunAsync(new CancellationToken()).GetAwaiter().GetResult();
30 }
31
32 public static async Task RunAsync(this IHost host, CancellationToken token = default (CancellationToken))
33 {
34 try
35 {
36 await host.StartAsync(token);
37 await host.WaitForShutdownAsync(token);
38 }
39 finally
40 {
41 if (host is IAsyncDisposable asyncDisposable)
42 await asyncDisposable.DisposeAsync();
43 else
44 host.Dispose();
45 }
46 }
47
48 public static async Task WaitForShutdownAsync(this IHost host, CancellationToken token = default (CancellationToken))
49 {
50 IHostApplicationLifetime service = host.Services.GetService<IHostApplicationLifetime>();
51 token.Register((Action<object>) (state => ((IHostApplicationLifetime) state).StopApplication()), (object) service);
52 TaskCompletionSource<object> completionSource = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
53 service.ApplicationStopping.Register((Action<object>) (obj => ((TaskCompletionSource<object>) obj).TrySetResult((object) null)), (object) completionSource);
54 object task = await completionSource.Task;
55 await host.StopAsync(new CancellationToken());
56 }
57 }
58 }