@page "/workers"
@inherits DashboardPageBase
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject IDashboardSessionAdminService SessionAdminService
Dashboard Workers
@if (Snapshot is null)
{
Loading workers.
}
else
{
@if (CanManage && !string.IsNullOrWhiteSpace(ResultMessage))
{
@ResultMessage
}
@if (CanManage)
{
}
@if (Snapshot.Workers.Count == 0)
{
No worker processes are attached.
}
else
{
| Process |
State |
Session |
Heartbeat |
Fault |
@if (CanManage)
{
Actions |
}
@foreach (DashboardWorkerSummary worker in Snapshot.Workers)
{
| @(worker.ProcessId?.ToString(System.Globalization.CultureInfo.InvariantCulture) ?? "-") |
|
@worker.SessionId |
@DashboardDisplay.DateTime(worker.LastHeartbeatAt) |
@DashboardDisplay.Text(worker.LastFault) |
@if (CanManage)
{
|
}
}
}
}
@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;
}
}
}