作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Async.SwitchToNewThread 的 MS 文档中给出的例子之一是:
let asyncMethod f =
async {
do! Async.SwitchToNewThread()
let result = f()
do! Async.SwitchToThreadPool()
return result
}
最佳答案
这个例子可能更清楚,因为它没有展示任何真实的场景。
但是,在 return
之前切换到另一个线程是有充分理由的。 .原因是调用您的函数的工作流(例如 asyncMethod
)将继续在您返回之前切换到的上下文/线程中运行。例如,如果你写:
Async.Start (async {
// Starts running on some thread (depends on how it is started - 'Async.Start' uses
// thread pool and 'Async.StartImmediate' uses the current thread
do! asyncMethod (fun () ->
Thread.Sleep(1000) ) // Blocks a newly created thread for 1 sec
// Continues running on the thread pool thread
Thread.Sleep(1000) }) // Blocks thread pool thread
SynchronizationContext
它们在其上启动(例如,如果工作流在 GUI 线程上启动,则它可以切换到新线程,但随后应返回到 GUI 线程)。如果我在写
asyncMethod
功能,我会使用:
let asyncMethod f = async {
let original = System.Threading.SynchronizationContext.Current
do! Async.SwitchToNewThread()
let result = f()
do! Async.SwitchToContext(original)
return result }
SwitchTo
操作返回
Async<unit>
并且需要使用
do!
调用是没有办法直接切换到不同的线程。将工作流的其余部分作为函数(可以在新线程上执行)的唯一点是使用
do!
时。或
let!
Async<T>
type 本质上只是一些获取函数(工作流的其余部分)并可以在任何地方执行它的对象,但没有其他方法可以“破坏”工作流。
关于multithreading - F#:在异步返回之前 SwitchToThreadPool 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433397/
在 Async.SwitchToNewThread 的 MS 文档中给出的例子之一是: let asyncMethod f = async { do! Async.Switc
我是一名优秀的程序员,十分优秀!