首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消ValueTask<T>

如何取消ValueTask<T>
EN

Stack Overflow用户
提问于 2019-12-13 14:22:47
回答 1查看 534关注 0票数 0

我知道如何取消任务,但找不到关于如何将取消添加到ValueTask方法的任何信息。通常我会取消这样的任务:

代码语言:javascript
复制
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);
}

或者像这样:

代码语言:javascript
复制
if (cancellationToken.IsCancellationRequested)
    return Task.FromCanceled<int>(cancellationToken);

问题是,ValueTask既没有FromCanceled,也没有WhenAny。我是不是该这么做..。

代码语言:javascript
复制
cancellationToken.ThrowIfCancellationRequested();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 14:29:18

您所指的“取消”不是真正的取消,而是取消等待,而不是操作。

您可以使用ValueTask<T>进行同样的假取消;您只需将其转换为Task<T>即可:

代码语言:javascript
复制
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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59324442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档