我在 F# 中有以下代码:
let CreateSampleDataFromJson<'T>(path) =
let uri = new Uri(path)
async {
let file = StorageFile.GetFileFromApplicationUriAsync(uri)
let jsonText = FileIO.ReadTextAsync(file)
return JsonObject<'T>.Parse(jsonText)
}
我遇到的问题file
是 aIAsyncOperation<StorageFile>
而不是 a预期的StorageFile
那样。ReadTextAsync
在 C# 中,您可以执行类似的操作:
var file = await StorageFile.GetFileFromApplicationUriAsync(uri)
IE
public async Task<T> CreateSampleDataFromUrl<T>(string path)
{
var uri = new Uri(path);
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
var jsonText = await FileIO.ReadTextAsync(file);
return JsonObject<T>.Parse(jsonText);
}
问题是我不知道如何IAsyncOperation
在 F# 中等待。常规的let!
不行。即以下无法编译:
async {
let! file = StorageFile.GetFileFromApplicationUriAsync(uri)
随着编译器错误:
error FS0001: This expression was expected to have type Async<'a> but here has type IAsyncOperation<StorageFile>
我发现一个文档说AsTask()
在类中定义了一个扩展方法System.WindowsRuntimeSystemExtensions
,我可以使用如下:
let! file = StorageFile.GetFileFromApplicationUriAsync(uri).AsTask() |> Async.AwaitTask
有没有一种标准的方法来做到这一点,或者某个地方的 F# 库中可用的东西让它变得更好一些?