我正在 Blazor 服务器端页面中设置计时器。目标是每 x 秒调用一次 API,并根据返回值更新 UI。
我得到这个代码:
private string Time { get; set; }
protected override void OnInitialized()
{
var timer = new System.Threading.Timer((_) =>
{
Time = DateTime.Now.ToString();
InvokeAsync(() =>
{
StateHasChanged();
});
}, null, 0, 1000);
base.OnInitialized();
}
这效果很好。 UI 每秒更新一次新的时间值。但是,我不知道如何调用异步任务来获取值。我想更换线路:
Time = DateTime.Now.ToString();
一行调用以下函数:
private async Task<string> GetValue()
{
var result = await _api.GetAsync<StringDto>("/api/GetValue");
return result.Text;
}
我试过这条线:
Time = GetValue().Result;
但我收到以下错误:
The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering or component state.
我需要做什么来调用异步方法?
非常感谢!
您可能不想 Invoke() GetValue(),那是毫无意义的。您可以像这样实现计时器:
System.Threading.Timer timer;
protected override void OnInitialized()
{
timer = new System.Threading.Timer(async _ => // async void
{
Time = await GetValue();
// we need StateHasChanged() because this is an async void handler
// we need to Invoke it because we could be on the wrong Thread
await InvokeAsync(StateHasChanged);
}, null, 0, 1000);
}
我使用一个字段来存储计时器,因为您应该处置它,将其添加到 Razor 部分:
@implements IDisposable
这是代码:
public void Dispose()
{
timer?.Dispose();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)