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
时存在竞争条件。