Я пытаюсь отменить задание задержки async (Task.Delay), которое было создано с помощью запроса веб-api, с другим запросом веб-api, который вызывает отмену. Не похоже, чтобы он отменил таймер для task.delay. Вот фрагмент кода, который я пытаюсь реализовать. Для вашей информации я использую объект Application для хранения объекта CancellationTokenSource для извлечения источника токена по нескольким запросам. Обновление Вопрос: Я ожидаю, что задача будет отменена, выбросив исключение из кода. Но этого никогда не было. Как мне заставить этот код отменить task.delay?Отмена длительной задержки запуска
using Microsoft.Practices.Unity;
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
namespace WebApplication8.Controllers
{
public class TaskController : ApiController
{
[HttpGet]
public async Task<string> CreateTask(int id)
{
var tokenSource = new CancellationTokenSource();
var concurrentTokens = GetConcurrentTokens();
concurrentTokens.TryAdd(id, tokenSource);
CancellationToken token = tokenSource.Token;
token.ThrowIfCancellationRequested();
await Task.Delay(50000,token);
return "Task Created";
}
[HttpGet]
public async Task<string> Cancel(int id)
{
var concurrentTokens = GetConcurrentTokens();
CancellationTokenSource item = concurrentTokens.First(t => t.Key == id).Value;
item.Cancel();
item.Dispose();
var tokenSource2 = new CancellationTokenSource();
concurrentTokens.TryRemove(id,out tokenSource2);
return "Cancelled";
}
private ConcurrentDictionary<long, CancellationTokenSource> GetConcurrentTokens()
{
var tokens = HttpContext.Current.Application["Tokens"];
if (tokens == null)
{
tokens = new ConcurrentDictionary<long, CancellationTokenSource>();
HttpContext.Current.Application["Tokens"] = tokens;
}
return (ConcurrentDictionary<long, CancellationTokenSource>) tokens;
}
}
}
«Не похоже, чтобы он отменил таймер для task.delay». -> Можете ли вы подробнее рассказать о том, что видите по сравнению с тем, что вы ожидаете? Я не уверен, в чем проблема. –
Я ожидаю, что исключение должно быть брошено, когда задача отменена. На самом деле я вижу, что задача выполняется непрерывно, не зная, что задача отменена. – Amzath