【发布时间】:2017-01-27 11:36:19
【问题描述】:
我正在尝试取消由 Web api 请求创建的异步延迟任务 (Task.Delay),并使用另一个发出取消的 Web api 请求。看起来它没有取消 task.delay 的计时器。这是我正在尝试实现的代码 sn-p。为了您的信息,我使用 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 的计时器。" -> 你能详细说明你看到的和你期望的吗?我不确定是什么问题。
-
我希望在取消任务时会引发异常。实际上我看到任务连续运行而没有意识到任务被取消。
标签: c# asp.net-web-api async-await task cancellationtokensource