【问题标题】:How to deal with ValueTask<T> in F#?F#中如何处理ValueTask<T>?
【发布时间】:2018-09-18 07:23:24
【问题描述】:

显然.NET 的全新ValueTask&lt;T&gt;Task&lt;T&gt;精简 版本。这很酷,但如果在我必须使用 Async.AwaitTask 将我的 F# Async 工作流与 Task 集成之前,我现在应该如何处理 ValueTask?

【问题讨论】:

  • 有一个 RFC 使用 AwaitValueTask 函数向 F# 添加对此的支持。 github.com/fsharp/fslang-design/blob/master/RFCs/…
  • 你可以很容易地用更原始的Async.FromContinuations 实现Async.AwaitTask - 我想你可以对ValueTask&lt;'t&gt; 做同样的事情

标签: .net asynchronous f# async-await c#-to-f#


【解决方案1】:

在实现Async.AwaitValueTask 之前(感谢Aaron),可以使用ValueTask 的AsTask 方法,现在使用Async.AwaitTask,作为最简单的解决方案。

【讨论】:

    【解决方案2】:

    我的 OSS 项目 "FusionTasks" 可以自然地处理并隐含地解释 TaskValueTask 与 F# 异步工作流上的 F# Async 类型相同:

    let asyncTest = async {
      use ms = new MemoryStream()
    
      // FusionTasks directly interpreted Task class in F# async-workflow block.
      do! ms.WriteAsync(data, 0, data.Length)
      do ms.Position <- 0L
    
      // FusionTasks directly interpreted Task<T> class in F# async-workflow block.
      let! length = ms.ReadAsync(data2, 0, data2.Length)
      do length |> should equal data2.Length
    }
    

    【讨论】:

      【解决方案3】:

      使用新的任务表达式,这里解释: https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions#value-tasks

      我刚刚实现了一个System.IAsyncDisposable,它返回一个System.Threading.Tasks.ValueTask,如下所示:

          interface IAsyncDisposable with
              member _.DisposeAsync(): ValueTask = 
                  task {
                      use _ = client
                      return ()
                  } |> ValueTask
      

      您可以看到我只是将任务传递给ValueTask

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 2017-06-14
        • 2019-02-24
        • 1970-01-01
        • 2017-08-17
        • 2018-10-22
        • 2010-11-30
        • 1970-01-01
        相关资源
        最近更新 更多