Async mvvm freezes GUI

My goal -

  • run the GUI effect,
  • waiting for async to work without freezing the GUI
  • make the final GUI effect

I prepared the first demo code using a view model with the following

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

It behaves as expected, so I am pleased with the above. The problem is that I am replacing Dream in a demo with real locking work, for example, with a wcf consumer, and I get some results.

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
    }

called from my last delegate command

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

Unfortunately, it freezes the GUI during the update (why?)

+4
source share
1 answer

CheckReport. , (.. let! do!), .

, , StartImmediate, , let! do!. , , .

WCF , , WCF, :

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

Source: https://habr.com/ru/post/1664849/


All Articles