我有一组 F# 脚本,它们调用我们创建的各种库,其中许多公开了最初用 C# 编写的异步方法。最近我发现脚本停止工作了(我想距离我上次使用它们大约有半年时间了,然后它们工作了)。
我试图隔离问题并想出了以下重现它的代码:
首先,让我们考虑一个包含以下 C# 类的库:
public class AsyncClass
{
public async Task<string> GetStringAsync()
{
var uri = new Uri("https://www.google.com");
var client = new HttpClient();
var response = await client.GetAsync(uri);
var body = await response.Content.ReadAsStringAsync();
return body;
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,让我们使用以下代码从 F#(FSX 脚本)调用库:
let asyncClient = AsyncClass()
let strval1 = asyncClient.GetStringAsync() |> Async.AwaitTask |> Async.RunSynchronously
printfn "%s" strval1
let strval2 =
async {
return! asyncClient.GetStringAsync() |> Async.AwaitTask
} |> Async.RunSynchronously
printfn "%s" strval2
Run Code Online (Sandbox Code Playgroud)
获取strval1以死锁告终,而strval2检索得很好(我很确定第一个场景在几个月前也曾经工作过,所以看起来可能是某种更新导致了这种情况)。 …