gpt4 book ai didi

asynchronous - 异步 mvvm 卡住 GUI

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

我的目标是

  • 启动一个GUI效果,
  • 等待一些异步工作而不卡住 GUI
  • 做一个最终的GUI效果

  • 我使用 View 模型准备了第一个演示代码,其中包含以下内容
    member this.RunSetStatus() = 
    async {
    this.Status <- "!Start resetting @" + DateTime.Now.ToString "yy.MM.dd hh:mm:ss"
    let! task = async {

    do! Async.Sleep (10 * 1000)
    return "!Reset done @" + DateTime.Now.ToString "yy.MM.dd hh:mm:ss"
    }

    this.Status <- task
    } |> Async.StartImmediate

    它的行为符合预期,所以我对上述内容感到满意。
    问题是当我用真正的阻塞工作替换演示中的 sleep 时,比如 wcf 消费者,检索一些结果。
    member this.CheckReport(user : string) =
    async {
    let endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof<IClaimService>),
    new BasicHttpBinding(),
    new EndpointAddress(address))
    let factory = new ChannelFactory<IClaimService>(endpoint)
    let channel = factory.CreateChannel()
    let resp = channel.CheckReport(user)
    factory.Close()
    return resp
    }

    从我的最终委托(delegate)命令中调用
    let RefreshLogic() = 
    this.RefreshIsActive <- true
    async {
    let cons = ConsumerLib.ConsumerWCF()
    let! task, msg = async {
    try
    let! resp = cons.CheckReport(Environment.UserName.ToLower())
    return resp , ""
    with
    |exc -> return [||], (ConsumerLib.FindInner(exc).Message + ConsumerLib.FindInner(exc).StackTrace)
    }
    this.Reports <- task
    this.RefreshIsActive <- false
    this.StatusMsg <- msg
    this.ExportCommand.RaiseCanExecuteChanged()
    } |> Async.StartImmediate

    不幸的是,它在刷新时卡住了 GUI(为什么?)

    最佳答案

    问题是你的CheckReport功能。虽然它是一个异步 block ,但它实际上从未调用任何异步工作(即:没有通过 let!do! 绑定(bind)),因此整个 block 同步运行。

    即使工作在异步工作流中,当您使用 StartImmediate ,工作同步运行到第一个实际的异步函数调用,这将被 let! 绑定(bind)。或 do! .由于你的工作是完全同步的,这会向上传播,最终同步,阻塞 UI。

    如果您的 WCF 绑定(bind)设置为包含 Task 返回的异步版本,则最好的方法是使用 WCF 方法的异步版本,如下所示:

    let! resp = channel.CheckReportAsync(user) |> Async.AwaitTask

    关于asynchronous - 异步 mvvm 卡住 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323129/

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