繁体   English   中英

如何取消 ValueTask<t></t>

[英]How to cancel ValueTask<T>

我知道如何取消任务,但找不到有关如何将取消添加到 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();

您所指的那种“取消”并不是真正的取消; 您正在取消等待,而不是操作

您可以使用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM