首页 > 解决方案 > 取消另一个类 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();
    }

任何人都知道为什么这不起作用,在这种情况下是解决方案吗?

标签: c#taskcancellationtokensourcecancellation-token

解决方案


是否clock.Delay(BUILT_TIME)有接受 a 的重载CancellationToken?如果是这样,请使用它。

clock.Delay(BUILT_TIME)问题是,如果取消时代码已经在等待,clock.Delay则不知道它需要抛出异常。


推荐阅读