如何将 CancellationToken 传递给 WebApi 操作?
How to pass CancellationToken to WebApi action?
我正在向 WebApi 发出如下请求:
var response = client.PostAsJsonAsync(url, dto).Result;
我在控制器操作中使用 HostingEnvironment
,这样我就可以在后台线程中完成工作,并将 IIS 的取消令牌传递给我的服务方法,如下所示:
public IHttpActionResult MyAction(SearchDto dto)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
{
//Do background work
var result = await myService.DoWorkAsync(dto, ct);
});
return Ok();
}
现在我想从客户端传递一个取消令牌,以便用户可以取消请求,所以我创建了一个 CancellationTokenSource
并在客户端上做了以下更改:
var response = client.PostAsJsonAsync(url, dto, cts.Token).Result;
以及对动作的更改:
public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
{
//Do background work
var result = await myService.DoWorkAsync(dto, ct);
});
return Ok();
}
我的问题是:
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
如果我需要使用传递给操作的 ct
,我将如何使用 IIS 需要传递给后台线程的 ct
?
您需要做的是合并您获得的两个取消令牌,第一个来自客户端,第二个来自 HostingEnvironment
。你可以用这个 CancellationTokenSource.CreateLinkedTokenSource 方法
public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct1)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct2 =>
{
using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
{
var result = await myService.DoWorkAsync(dto, linkedCts.Token);
}
});
return Ok();
}
我正在向 WebApi 发出如下请求:
var response = client.PostAsJsonAsync(url, dto).Result;
我在控制器操作中使用 HostingEnvironment
,这样我就可以在后台线程中完成工作,并将 IIS 的取消令牌传递给我的服务方法,如下所示:
public IHttpActionResult MyAction(SearchDto dto)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
{
//Do background work
var result = await myService.DoWorkAsync(dto, ct);
});
return Ok();
}
现在我想从客户端传递一个取消令牌,以便用户可以取消请求,所以我创建了一个 CancellationTokenSource
并在客户端上做了以下更改:
var response = client.PostAsJsonAsync(url, dto, cts.Token).Result;
以及对动作的更改:
public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
{
//Do background work
var result = await myService.DoWorkAsync(dto, ct);
});
return Ok();
}
我的问题是:
HostingEnvironment.QueueBackgroundWorkItem(async ct =>
如果我需要使用传递给操作的 ct
,我将如何使用 IIS 需要传递给后台线程的 ct
?
您需要做的是合并您获得的两个取消令牌,第一个来自客户端,第二个来自 HostingEnvironment
。你可以用这个 CancellationTokenSource.CreateLinkedTokenSource 方法
public IHttpActionResult MyAction(SearchDto dto, CancellationToken ct1)
{
HostingEnvironment.QueueBackgroundWorkItem(async ct2 =>
{
using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
{
var result = await myService.DoWorkAsync(dto, linkedCts.Token);
}
});
return Ok();
}