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

在服务器端Blazor中,如何取消页面或组件的长时间运行的后台任务?,blazor,blazor-server-side,Blazor,Blazor Server Side,假设我有一个长时间运行的任务,我已经从我的page类的OnInitializedAsync()方法初始化并启动了该任务,该方法派生自Microsoft.AspNetCore.Components.ComponentBase。我使用它来收集数据,它会不时地更新Ui,效果非常好 但总有一天我需要摆脱这个背景任务。当客户端更改到另一个页面或离开web应用程序时,我想取消我的任务,这样它就不会一直运行下去。我没有找到合适的生命周期方法 有什么建议吗?以下是使用CancellationTokenSourc

假设我有一个长时间运行的任务,我已经从我的page类的OnInitializedAsync()方法初始化并启动了该任务,该方法派生自Microsoft.AspNetCore.Components.ComponentBase。我使用它来收集数据,它会不时地更新Ui,效果非常好

但总有一天我需要摆脱这个背景任务。当客户端更改到另一个页面或离开web应用程序时,我想取消我的任务,这样它就不会一直运行下去。我没有找到合适的生命周期方法


有什么建议吗?

以下是使用
CancellationTokenSource取消任务的示例

@使用System.Threading
@注入HttpClient\u HttpClient
@实现IDisposable
...
@代码{
私有CancellationTokenSource\u CancellationTokenSource;
私有IEnumerable_数据;
受保护的重写异步任务OnInitializedAsync()
{
_cancellationTokenSource=新的cancellationTokenSource();
var response=await\u httpClient.GetAsync(“api/data”,\u cancellationTokenSource.Token)
.配置等待(错误);
response.EnsureSuccessStatusCode();
var content=await response.content.ReadAsStringAsync()
.配置等待(错误);
_data=JsonSerializer.Deserialize(内容);
}
//如果组件已销毁,请取消任务
void IDisposable.Dispose()无效
{
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
}
}

我在“虽然这不是ComponentBase的严格生命周期方法之一,但如果组件实现了IDisposable,那么Blazor将在组件从其父级渲染树中移除后执行Dispose”上找到一条提示。这是正确的方法吗?您好,看看IDisposable。正如本教程所示(几乎在网站底部),谢谢,就在今天,我正在考虑创建一个全局令牌来取消SPA dispose上的所有“远程请求”。@Danielrera我认为这是没有用的,因为您的所有引用都将由DI容器处理,但从未尝试过。我有一些异步任务以
statehaschange
结束。有时我导航到另一个SPA,并在异步完成并希望再次呈现页面时转到上一个SPA。我希望用代币来解决这个问题。