我是F#的新手,从F#开发人员的角度来理解C#中的异步。假设在C#中有以下代码片段:
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
如何在F#中编写相同的代码?
发布于 2014-10-05 01:29:14
下面是一个函数,它应该完成您正在寻找的功能(请注意,您必须将代码包装在异步计算表达式中才能使用let!语法):
let getAsync (url:string) =
async {
let httpClient = new System.Net.Http.HttpClient()
let! response = httpClient.GetAsync(url) |> Async.AwaitTask
response.EnsureSuccessStatusCode () |> ignore
let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
return content
}
发布于 2014-10-05 01:28:59
您可以使用async
let readString (url: Uri) = async {
let httpClient = new HttpClient();
let! response = httpClient.GetAsync(url) |> Async.AwaitTask
response.EnsureSuccessStatusCode() |> ignore
return! response.Content.ReadAsStringAsync() |> Async.AwaitTask
}
发布于 2019-02-27 21:25:05
这只是我的两个观点。但我的理解是,在使用EnsureSuccessStatusCode()
时,我们应该处理HttpRequestException
。
下面是封装HttpClient
的模块的开始,该模块将把URL的响应缓冲到string
中,并安全地包装在Result<'a, 'b>
中,以提高容错能力。
module Http =
open System
open System.Net.Http
let getStringAsync url =
async {
let httpClient = new HttpClient()
// This can be easily be made into a HttpClientFactory.Create() call
// if you're using >= netcore2.1
try
use! resp = httpClient.GetAsync(Uri(url), HttpCompletionOption.ResponseHeadersRead) |> Async.AwaitTask
resp.EnsureSuccessStatusCode |> ignore
let! str = resp.Content.ReadAsStringAsync() |> Async.AwaitTask
return Ok str
with
| :? HttpRequestException as ex -> return ex.Message |> Error
}
https://stackoverflow.com/questions/26195133
复制相似问题