在F#中使用ConfigureAwait(false)

7
我正在使用一种用C#编写的库,它使用异步/等待模式。在C#中,我可以通过调用ConfigureAwait(false)来等待某些内容,但是当我从F#使用该库时,我不知道如何做同样的事情?
目前我使用 SomeMethodAsync() |> Async.AwaitTask 将其转换为一个 Async F# 工作流,但是当调用SomeMethodAsync时,如何在F#中执行与ConfigureAwait(false)相同的操作?

编辑:

在 F# Slack 频道和一些额外的搜索中得到了一些帮助,我在这里找到了一个很好的解释,可以切换上下文:http://tomasp.net/blog/async-non-blocking-gui.aspx/


你为什么不想继续使用捕获的上下文?这背后的大问题是什么? - Fyodor Soikin
2
据我所知,这是库代码的良好实践。这篇文章解释得很清楚:https://dev59.com/VWUq5IYBdhLWcg3waPpC - dustinmoris
SomeMethodAsync().ConfigureAwait(false) |> Async.AwaitTask 对你不起作用吗? - Fyodor Soikin
1
实际上我找到了解决方案。有人指向了我这个链接:http://tomasp.net/blog/async-non-blocking-gui.aspx/ - dustinmoris
5
你可以将那个解决方案发布为答案并接受它 :) - niceman
显示剩余4条评论
1个回答

2

只需在将其转换为F#任务之前调用ConfigureAwait即可。

这很简单。
SomeMethodAsync().ConfigureAwait(false) |>  Async.AwaitTask

然而,如果你主要处理C#异步任务,使用TaskBuilder.fs计算表达式更加简洁。可以通过nuget使用dotnet add package TaskBuilder.fs进行安装。

无需手动调用ConfigureAwait(false),只需

open FSharp.Control.Tasks.V2.ContextInsensitive

每次使用let!时,它都会自动添加.ConfigureAwait(false)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接