gpt4 book ai didi

asynchronous - 使用异步工作流的 WPF 后台操作

转载 作者:行者123 更新时间:2023-12-04 04:19:15 25 4
gpt4 key购买 nike

为了在后台线程上执行操作并避免在 WPF 应用程序中阻塞 UI,我经常发现自己编写了以下模式:

async {
// some code on the UI thread

let uiThread = SynchronizationContext.Current
do! Async.SwitchToThreadPool()

let! result = // some Async<'t>

do! Async.SwitchToContext uiThread

// do things with the result if it wasn't () all along
}
  • 我这样做对吗?这是惯用语吗?应该采取不同的做法吗?
  • 如果这是正确的,当然我不想一直这样做 - 有没有内置的更短的方法来实现同样的事情?现有 Async 都没有函数似乎做类似的事情。
  • 如果没有,把上面的代码变成一个函数有意义吗?
    let onThreadPool operation =
    async {
    let context = SynchronizationContext.Current
    do! Async.SwitchToThreadPool()

    let! result = operation

    do! Async.SwitchToContext context

    return result
    }

  • 这增加了另一个级别 async { }嵌套 - 这会在“某些”点引起问题吗?

    最佳答案

    你在这里所做的肯定是有道理的。这里一个有用的操作是 Async.StartImmediate ,在当前线程上启动异步工作流。如果您从 UI 线程调用它,这将保证工作流也将在 UI 线程上启动,因此您可以捕获工作流内的同步上下文。

    另一个技巧是许多内置的异步 F# 操作会自动跳回原始同步上下文(那些使用 Async.FromContinuations 创建的,包括例如 AsyncDownloadString ),因此当您调用其中一个时,您不会甚至需要显式跳回到原来的同步上下文。

    但是对于其他异步操作(以及您想要在后台运行的非异步操作),您的 onThreadPool函数看起来是这样做的好方法。

    关于asynchronous - 使用异步工作流的 WPF 后台操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32261838/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com