小编Det*_*ras的帖子

WhenAny 在某些情况下表现得像 WhenAll

因此,我在使用第三方库时遇到了问题,即使调用cancellationToken.Cancel. 下面是一个原型,可以解决这种情况并且它可以工作。

public async Task MainAsync()
{
    try
    {
        await StartAsync().ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception thrown");
    }
}

private async Task<string> StartAsync()
{
    var cts = new CancellationTokenSource();

    cts.CancelAfter(3 * 1000);

    var tcs = new TaskCompletionSource<string>();

    cts.Token.Register(() => { Console.WriteLine("Cancelled"); tcs.TrySetCanceled(); });

    return await (await Task.WhenAny(tcs.Task, LongComputationAsync())
        .ConfigureAwait(false)).ConfigureAwait(false);
}

private async Task<string> LongComputationAsync()
{
    await Task.Delay(1 * 60 * 1000).ConfigureAwait(false);

    return "Done";
}
Run Code Online (Sandbox Code Playgroud)

所以上面的代码会等待 3 秒,然后它会抛出一个TaskCancelledException应该的异常。如果您随后将方法更改LongComputationAsync为以下内容:

private Task<string> LongComputationAsync()
{
    Task.Delay(1 * …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await .net-5

1
推荐指数
1
解决办法
119
查看次数

标签 统计

.net-5 ×1

async-await ×1

c# ×1

task-parallel-library ×1