C# 获取上次请求的异步结果并取消以前未完成的任务
我有多个繁重的工作计算请求。这项工作可能需要不同的时间。通过使用C# 获取上次请求的异步结果并取消以前未完成的任务,c#,asynchronous,task-parallel-library,async-await,C#,Asynchronous,Task Parallel Library,Async Await,我有多个繁重的工作计算请求。这项工作可能需要不同的时间。通过使用async和await我希望获得最后请求的结果,并取消最终未完成的先前任务 目前我正在使用BackGroundWorker设置作业ID。我只使用了最后一个请求ID的结果 我可以使用asyncwait重写代码吗 private int backtestId; private void PrepareStrategyCalculation() { backtestId = backtestManager.GetNextBack
async
和await
我希望获得最后请求的结果,并取消最终未完成的先前任务
目前我正在使用BackGroundWorker设置作业ID。我只使用了最后一个请求ID的结果
我可以使用async
wait
重写代码吗
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;
...
}
假设您的代码受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();
}
您能解释一下如何调用多个请求吗?(您的代码中似乎只有一个请求。)当您从
calculatedStrategy.BacktestId!=backtestId
?调用PrepareStrageyCalculation()
有很多原因:用户更改的值、数据文件加载、设置更改。。。不幸的是,对仍在运行的旧请求没有取消。他们听天由命。主要目标是使结果与用户的最后设置相对应。这是一个非常好的解决方案。因此,我只需要将取消发送到所有以前启动的任务,只剩下最后一次请求的任务。我认为这段代码不能保证结果来自最后一次调用。请看这里我的实现:(在必须回答时真的很糟糕):@miroslavpov:复制CancellationToken
时存在竞争条件。