c# - 取消不可取消的任务
问题描述
我在代码库中有以下代码:
public async Task<HttpApiResponse> FindUsers(Guid userId)
{
try
{
AccessToken token = tokenService.GetAccessToken();
channel = channelFactory.CreateChannelWithToken(token);
HttpApiResponse response = await channel.FindUsers(request);
return response.ToDto();
}
}
现在我喜欢在这里使用 CancellationToken,但我不太确定我是否做得对:
public async Task<HttpApiResponse> FindUsers(Guid userId, CancellationToken ct)
{
try
{
var taskCompletionSource = new TaskCompletionSource<decimal>();
ct.Register(() =>
{
// We received a cancellation message, cancel the TaskCompletionSource.Task
taskCompletionSource.TrySetCanceled();
});
AccessToken token = await tokenService.GetAccessToken();
await Task.WhenAny(token, taskCompletionSource.Task).ContinueWith(async token =>
{
channel = channelFactory.CreateChannelWithToken(token);
HttpApiResponse response = await channel.FindUsers(request);
return response.ToDto();
});
}
}
我不确定的原因是因为我不确定我应该如何处理await channel.FindUsers(request);
内部ContinueWith
。我是否需要处理它,因为我在获取令牌时已经处理它?
解决方案
您不能真正取消不支持取消的 API,但您可以在调用之前使用TaskCompletionSource
从您的方法返回并完成,如果这是您想要的。FindUsers
GetAccessToken
FindUsers
OperationCanceledException
如果CancellationToken
在当前实现/重载FindUsers
返回值之前取消,则以下重载将抛出一个:
public async Task<HttpApiResponse> FindUsers(Guid userId, CancellationToken ct)
{
var taskCompletionSource = new TaskCompletionSource<decimal>();
using (ct.Register(() => taskCompletionSource.TrySetCanceled()))
{
var findUsersTask = FindUsers(userId);
await Task.WhenAny(findUsersTask, taskCompletionSource.Task);
ct.ThrowIfCancellationRequested();
return findUsersTask.Result;
}
}
推荐阅读
- python - VK_API:音乐、json解码器的问题
- rust - Crate 和 Package 之间的确切区别是什么?
- variables - 如何在 Rust 模块/库中创建变量?
- powerbi - PowerBi - 使用 2 个 X 轴值和 1 个 Y 轴值创建图表
- python - 通过 ssh 连接到 Ubuntu 服务器时,在 vscode 中使用 .env 文件
- flutter - Flutter:在同一个脚手架中像这样制作路由子节点
- ios - 如何在 react-native 中提高视频性能?
- python - Python:当模块位于应用程序根目录上方的父目录中时解析导入
- multithreading - 如何更改数字的线程安全值
- ajax - 在ajax显示值中显示null