@page "/workers" @inherits DashboardPageBase @inject AuthenticationStateProvider AuthenticationStateProvider @inject IDashboardSessionAdminService SessionAdminService Dashboard Workers @if (Snapshot is null) {
Loading workers.
} else {

Workers

@Snapshot.Workers.Count worker rows
@if (CanManage && !string.IsNullOrWhiteSpace(ResultMessage)) { } @if (CanManage) { }
@if (Snapshot.Workers.Count == 0) {
No worker processes are attached.
} else {
@if (CanManage) { } @foreach (DashboardWorkerSummary worker in Snapshot.Workers) { @if (CanManage) { } }
Process State Session Heartbeat FaultActions
@(worker.ProcessId?.ToString(System.Globalization.CultureInfo.InvariantCulture) ?? "-") @worker.SessionId @DashboardDisplay.DateTime(worker.LastHeartbeatAt) @DashboardDisplay.Text(worker.LastFault)
}
} @code { private bool CanManage { get; set; } private bool IsBusy { get; set; } private string? ResultMessage { get; set; } private bool LastOperationSucceeded { get; set; } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync().ConfigureAwait(false); AuthenticationState authenticationState = await AuthenticationStateProvider.GetAuthenticationStateAsync() .ConfigureAwait(false); CanManage = SessionAdminService.CanManage(authenticationState.User); } private string? PendingSessionId { get; set; } private void RequestKill(string sessionId) { if (IsBusy) { return; } PendingSessionId = sessionId; } private void CancelPending() { if (!IsBusy) { PendingSessionId = null; } } private async Task ConfirmKillAsync() { if (IsBusy || PendingSessionId is null) { return; } string sessionId = PendingSessionId; IsBusy = true; try { AuthenticationState authenticationState = await AuthenticationStateProvider.GetAuthenticationStateAsync() .ConfigureAwait(false); CanManage = SessionAdminService.CanManage(authenticationState.User); DashboardSessionAdminResult result = await SessionAdminService .KillWorkerAsync(authenticationState.User, sessionId, CancellationToken.None) .ConfigureAwait(false); ResultMessage = result.Message; LastOperationSucceeded = result.Succeeded; } finally { IsBusy = false; PendingSessionId = null; } } }