gpt4 book ai didi

f# - 在 F# 中使用 Task.WhenAll 重写 C# 代码

转载 作者:行者123 更新时间:2023-12-04 06:35:20 26 4
gpt4 key购买 nike

我有以下接口(interface)方法:

Task<string[]> GetBlobsFromContainer(string containerName);

及其在 C# 中的实现:
var container = await _containerClient.GetContainer(containerName);
var tasks = container.ListBlobs()
.Cast<CloudBlockBlob>()
.Select(b => b.DownloadTextAsync());
return await Task.WhenAll(tasks);

当我尝试在 F# 中重写它时:
member this.GetBlobsFromContainer(containerName : string) : Task<string[]> =
let task = async {
let! container = containerClient.GetContainer(containerName) |> Async.AwaitTask
return container.ListBlobs()
|> Seq.cast<CloudBlockBlob>
|> Seq.map (fun b -> b.DownloadTextAsync())
|> ??
}
task |> ??

我坚持最后几行。

如何返回 Task<string[]>来自 F# 正确吗?

最佳答案

我不得不猜测 containerClient 的类型是什么是,我找到的最接近的是 CloudBlobClient (它没有 getContainer: string -> Task<CloubBlobContainer> 但不应该太难适应)。然后,您的函数可能如下所示:

open System
open System.Threading.Tasks
open Microsoft.WindowsAzure.Storage.Blob
open Microsoft.WindowsAzure.Storage

let containerClient : CloudBlobClient = null

let GetBlobsFromContainer(containerName : string) : Task<string[]> =
async {
let container = containerClient.GetContainerReference(containerName)
return! container.ListBlobs()
|> Seq.cast<CloudBlockBlob>
|> Seq.map (fun b -> b.DownloadTextAsync() |> Async.AwaitTask)
|> Async.Parallel
} |> Async.StartAsTask

我将返回类型更改为 Task<string[]>而不是 Task<string seq>因为我想你想保留界面。否则,我建议摆脱 Task并使用 Async在 F#-only 代码中。

关于f# - 在 F# 中使用 Task.WhenAll 重写 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31901304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com