using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
// 程序集引用 Microsoft.AspNetCore.Components.WebAssembly
public class BackgroundTaskService
{
private readonly NavigationManager _navigationManager;
private volatile bool _isRunningTask;
public BackgroundTaskService(NavigationManager navigationManager)
{
_navigationManager = navigationManager;
}
public async Task RunInBackground(Action action,
Action onException = null)
{
if (_isRunningTask)
{
return;
}
try
{
_isRunningTask = true;
var cancellationToken = new CancellationTokenSource();
var task = Task.Run(() =>
{
try
{
action(cancellationToken.Token);
}
catch (Exception ex)
{
onException?.Invoke(ex);
}
}, cancellationToken.Token);
// 等待任务结束或用户离开页面
await Task.WhenAny(task, _navigationManager.LocationChanged);
cancellationToken.Cancel();
await task;
}
finally
{
_isRunningTask = false;
}
}
}
该代码中定义了一个 BackgroundTaskService
类,提供了一个 RunInBackground
方法来在后台执行操作。使用时,只需将操作代码传入此方法即可。