你的方法的问题是
RunSynchronously
阻止您尝试使用的线程,以使用
Async.SwitchToContext ctx
.
当使用f interactive时,有一个主线程在f interactive中运行并处理用户交互。这是可以使用windows窗体控件的线程,因此您可以正确地创建
WebBrowser
在外面
async
. 等待
DocumentCompleted
在线程池线程(运行异步工作流)上发生,但当您尝试切换回主线程时,它已被
Async.RunSynchronously
.
通过运行调用
Application.DoEvents
处理主线程上的事件(这也将允许它运行异步的其余部分)。你的
downloadWebSite
保持不变,但现在您可以使用:
let test =
downloadWebSite (Uri "http://www.google.com") Some
|> Async.Ignore
|> Async.StartAsTask
while not test.IsCompleted do
System.Threading.Thread.Sleep(100)
System.Windows.Forms.Application.DoEvents()
这是一个小技巧-如果您不需要等待结果(例如,只需返回一个任务并在运行下一个命令之前等待),那么可能有更好的方法来构建它,但这应该可以做到。