我知道如何取消任务,但找不到关于如何将取消添加到ValueTask方法的任何信息。通常我会取消这样的任务:
public async Task<int> Foo(
CancellationToken cancellationToken)
{
TaskCompletionSource<int> tcsCancel =
new TaskCompletionSource<int>();
cancellationToken.Register(() =>
{
tcsCancel.TrySetCanceled();
});
Task<int> task = LongOperation();
var completedTask = await Task.WhenAny(
tcsCancel.Task,
task).ConfigureAwait(false);
return await completedTask.ConfigureAwait(false);
}或者像这样:
if (cancellationToken.IsCancellationRequested)
return Task.FromCanceled<int>(cancellationToken);问题是,ValueTask既没有FromCanceled,也没有WhenAny。我是不是该这么做..。
cancellationToken.ThrowIfCancellationRequested();发布于 2019-12-13 14:29:18
您所指的“取消”不是真正的取消,而是取消等待,而不是操作。
您可以使用ValueTask<T>进行同样的假取消;您只需将其转换为Task<T>即可:
public async ValueTask<int> Foo(CancellationToken cancellationToken)
{
using var tcsCancel = new TaskCompletionSource<int>();
using var registration = cancellationToken.Register(() =>
{
tcsCancel.TrySetCanceled();
});
ValueTask<int> valueTask = LongOperation();
Task<int> task = valueTask.AsTask();
var completedTask = await Task.WhenAny(
tcsCancel.Task,
task).ConfigureAwait(false);
return await completedTask.ConfigureAwait(false);
}https://stackoverflow.com/questions/59324442
复制相似问题