我有多个繁重的工作计算请求。这项工作可能需要不同的时间。通过使用async
和await
,我想取消最后请求的结果,取消最终未完成的先前任务。
目前,我正在使用BackGroundWorker设置作业ID。我只使用了上次请求的ID的结果。
我可以使用async
await
重写代码吗?
private int backtestId;
private void PrepareStrategyCalculation()
{
backtestId = backtestManager.GetNextBacktestId();
strategy.BacktestId = backtestId;
backtestManager.StartBacktestWorker(strategy.Clone());
}
private void BacktestManager_StrategyBacktested(object sender, StrategyBacktestEventArgs e)
{
if (e.BacktestObject.Strategy.BacktestId != backtestId) return;
var calculatedStrategy = e.BacktestObject.Strategy;
...
}
编辑:
这是一个解决方案吗?
private int backtestId;
private async void PrepareStrategyCalculation()
{
backtestId = backtestManager.GetNextBacktestId();
strategy.BacktestId = backtestId;
var calculatedStrategy = await backtestManager.StartBacktestAsync(strategy.Clone());
if (calculatedStrategy.BacktestId != backtestId) return;
...
}
答案 0 :(得分:2)
假设您的代码受CPU限制,那么Task.Run
是BackgroundWorker
的合适替代。
您可以使用CancellationTokenSource
取消任务。所以,假设从单线程上下文(如UI线程)调用StartBacktestAsync
,这样的事情就可以了。
private CancellationTokenSource _cts;
async Task StartBacktestAsync()
{
if (_cts != null)
_cts.Cancel();
_cts = new CancellationTokenSource();
try
{
var token = _cts.Token;
await Task.Run(() => Backtest(token));
}
catch (OperationCanceledException)
{
// Any special logic for a canceled operation.
}
}
void Backtest(CancellationToken token)
{
... // periodically call token.ThrowIfCancellationRequested();
}