在服务器端Blazor中,如何取消长时间运行的页面或组件的后台任务?

时间:2019-12-03 05:41:04

标签: blazor blazor-server-side

说我有一个长期运行的任务,该任务已经从我的页面类的OnInitializedAsync()方法初始化并开始,该方法从Microsoft.AspNetCore.Components.ComponentBase派生。我用它来收集数据,它不时更新Ui,效果很好。

但是在某些时候,我需要摆脱该后台任务。当客户端切换到另一个页面或离开Web应用程序时,我想取消任务,这样它就不会一直运行下去。我找不到合适的生命周期方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

以下是使用CancellationTokenSource

取消任务的示例
@using System.Threading
@inject HttpClient _httpClient
@implement IDisposable

...

@code {
    private CancellationTokenSource _cancellationTokenSource;
    private IEnumerable<Data> _data;

    protected override async Task OnInitializedAsync()
    {
        _cancellationTokenSource = new CancellationTokenSource();
        var response = await _httpClient.GetAsync("api/data", _cancellationTokenSource.Token)
                .ConfigureAwait(false);
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync()
                .ConfigureAwait(false);
        _data = JsonSerializer.Deserialize<IEnumerable<Data>>(content);
    }

    // cancel the task we the component is destroyed
    void IDisposable.Dispose()
    {
         _cancellationTokenSource?.Cancel();
         _cancellationTokenSource?.Dispose();
    }
}