7

我是F#的新手,從C#開發人員的角度理解F#中的異步。假設在C#中有以下代碼片段:如何從F#中使用HttpClient?

var httpClient = new HttpClient(); 
var response = await httpClient.GetAsync(url); 
response.EnsureSuccessStatusCode(); 
string content = await response.Content.ReadAsStringAsync(); 

如何在F#中編寫相同的代碼?

回答

14

這是應該做的,你在找什麼(請注意,您必須包裝中的代碼異步計算表達式才能使用的功能讓語法):

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 
    } 
+2

應該不是前兩個'let's是'use's而不是? (httpClient&response is IDisposable) – Cogwheel 2016-02-08 22:34:27

6

您可以使用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 
} 
6

您很可能希望使用Http.fs,如果你在F#HttpClient做任何事情。