因此,我在使用第三方库时遇到了问题,即使调用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)