相关疑难解决方法(0)

理解F#异步编程

我有点了解F#中异步编程的语法.例如

let downloadUrl(url:string) = async { 
  let req = HttpWebRequest.Create(url)
  // Run operation asynchronously
  let! resp = req.AsyncGetResponse()
  let stream = resp.GetResponseStream()
  // Dispose 'StreamReader' when completed
  use reader = new StreamReader(stream)
  // Run asynchronously and then return the result
  return! reader.AsyncReadToEnd() }
Run Code Online (Sandbox Code Playgroud)

在F#专家书(和许多其他来源),他们说喜欢

让!var = expr只是表示"执行异步操作expr并在操作完成时将结果绑定到var.然后继续执行其余的计算主体"

我也知道在执行异步操作时会创建一个新线程.我最初的理解是异步操作后有两个并行线程,一个执行I/O,另一个继续同时执行异步主体.

但在这个例子中,我很困惑

  let! resp = req.AsyncGetResponse()
  let stream = resp.GetResponseStream()
Run Code Online (Sandbox Code Playgroud)

如果resp尚未启动并且异步体中的线程想要发生GetResponseStream什么?这可能是错误吗?

也许我原来的理解是错误的.F#专家书中引用的句子实际上意味着"创建一个新线程,挂起当前线程,当新线程完成时,唤醒正文线程并继续",但在这种情况下我看不到我们可以保存随时.

在最初的理解中,当一个异步块中有多个独立的 IO操作时,可以节省时间,这样它们可以在不相互干预的情况下同时完成.但是在这里,如果我没有得到回复,我就无法创建流; 只有我有流,我可以开始阅读流.获得的时间在哪里?

f# asynchronous

22
推荐指数
2
解决办法
3430
查看次数

从 F# 调用 C# 异步方法会导致死锁

我有一组 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检索得很好(我很确定第一个场景在几个月前也曾经工作过,所以看起来可能是某种更新导致了这种情况)。 …

c# f# asynchronous .net-core

5
推荐指数
1
解决办法
280
查看次数

标签 统计

asynchronous ×2

f# ×2

.net-core ×1

c# ×1