您可以使用DateTimeOffset
获取服务器时钟,并使用System.Threading.Timer
在SignalR中实时更新时间。请按照以下步骤进行操作。
ClockService
,该类将实现获取服务器时间的方法。public class ClockService
{
public DateTimeOffset GetCurrentTime()
{
return DateTimeOffset.UtcNow;
}
}
public class ClockHub : Hub
{
private readonly ClockService _clockService;
public ClockHub(ClockService clockService)
{
_clockService = clockService;
}
public override async Task OnConnectedAsync()
{
var timer = new System.Threading.Timer(async state =>
{
await Clients.All.SendAsync("UpdateTime", _clockService.GetCurrentTime());
}, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}
}
在上面的代码中,我们在连接到Hub时创建了一个计时器,并向所有客户端广播当前时间。 UpdateTime
是客户端调用的方法。
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@inject HubConnectionBuilder HubConnectionFactory
@CurrentTime
@code {
private HubConnection _hubConnection;
private DateTimeOffset _currentTime;
private string CurrentTime
{
get { return _currentTime.ToString("hh:mm:ss tt"); }
}
protected override async Task OnInitializedAsync()
{
_hubConnection = HubConnectionFactory
.WithUrl(Navigation.ToAbsoluteUri("/ClockHub"))
.Build();
_hubConnection.On("UpdateTime", time =>
{
_currentTime = time;
StateHasChanged();
});
await _hubConnection.StartAsync();
}
public void Dispose()
{
_hubConnection.DisposeAsync().AsTask().Wait();
}
}
在上面的代码中,我们通过HubConnectionBuilder
创建了一个新的HubConnection。在OnInitializedAsync
中连接到SignalR,并使用On
方法订阅UpdateTime
事件。当更新时间广播时,我们会更新本地时间,并使用StateHasChanged
刷新UI。
现在,当您启动应用程序时,您应该会看到实时更新的时间。
∠的问题∠Blazor Web服务应用程序与SignalR的服务器时钟不工作。
∠解法∠您可以使用DateTimeOffset
获取服务器时钟,并使用System.Threading.Timer
在SignalR中实时更新时间。请使用上面提供的代码示例。