c# - 取消另一个类 C# 中的任务
问题描述
我对 C# 中的 cancelTokenSource 有问题
public class Building {
public CancellationTokenSource BuildTokenSource;
public void StartBuilt()
{
BuildTokenSource = new CancellationTokenSource();
buildingService.buildTask = Task.Run(async () =>
{
await clock.Delay(BUILT_TIME);
}, BuildTokenSource.Token);
}
public void CancelBuilt()
{
if (BuildTokenSource != null)
{
BuildTokenSource.Cancel();
}
}
}
在另一个类中想要检测任务是否像这样取消但它不起作用。从未触发的 catch 异常
public async Task<Building> GetBuildingOfUserTask()
{
double remainingTime = unitService.GetRemainingTime();
if (remainingTime <= 2000 && remainingTime > 0.0)
{
Building building = GetBuilding();
CancellationToken cancellation = building.BuildTokenSource.Token;
try
{
await buildTask;
}
catch (OperationCanceledException) when (cancellation.IsCancellationRequested)
{
return GetBuildingOfUser();
}
}
return GetBuildingOfUser();
}
任何人都知道为什么这不起作用,在这种情况下是解决方案吗?
解决方案
是否clock.Delay(BUILT_TIME)
有接受 a 的重载CancellationToken
?如果是这样,请使用它。
clock.Delay(BUILT_TIME)
问题是,如果取消时代码已经在等待,clock.Delay
则不知道它需要抛出异常。
推荐阅读
- java - Java中的猪拉丁语翻译器不起作用?
- jenkins - Jenkins + Klocwork 社区插件增量分析
- c# - 使用 Automapper 将 C# 转换为 DTO/JSON
- javascript - 如何在 Immutable.js 中序列化数据历史以启用时间旅行?
- angular - Angular 8 中的页面导航不会触发 canDeactivate()
- typescript - 处理响应类型 async/await - IDE 错误
- javascript - D3 捏缩放在 v5 中不起作用,但在 v4 中起作用
- google-sheets - 具有 3 个标准的计数
- python - 计算度数 k 的平均聚类
- scala - Scala - 按可选字段排序,最后没有值