【问题标题】:Is there a ContinueWith for ValueTask?ValueTask 有 ContinueWith 吗?
【发布时间】:2020-04-25 10:29:04
【问题描述】:

如果 API 返回 ValueTaskValueTask<T>,有没有办法在其上执行 ContinueWith,就像我可以使用 Task 一样?是否有 Microsoft 提供的 NuGet 库用于在 .NET Standard 2.0 中执行此操作?

【问题讨论】:

  • ContinueWith 是旧版 API。坦率地说,您根本不应该使用它。您应该 await 任务和价值任务。

标签: c# .net async-await valuetask


【解决方案1】:

使用valueTask.AsTask()AsTask() 是您的用例的逃生舱口。 ValueTask 的目的是尽可能避免分配,但如果您要在另一个线程上调用延续,则需要分配一些东西,它也可能是 Task<T>

【讨论】:

    【解决方案2】:

    你在这里:

    public static async ValueTask ContinueWith(this ValueTask source,
        Action<ValueTask, Exception> continuationAction)
    {
        Exception exception = null;
        try
        {
            await source.ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            exception = ex;
        }
        continuationAction(source, exception);
    }
    

    【讨论】:

      【解决方案3】:

      我知道我发布得太晚了。但是想分享我使用的方法...

      ValueTask<T> vt = ValueTaskTReturningMethod();
      var awt = vt.GetAwaiter();
      awt.OnCompleted(() => {
         T val = awt.GetResult();
         //code you want to execute after async operation completes
      }
      

      【讨论】:

      • 或者只是T val = await vt; // code you want to execute... - 更简单
      猜你喜欢
      • 2017-06-14
      • 2019-02-24
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2016-08-08
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多