Swift Task.init{ NSAlert.runModal } crashes !

Why is NSAlert.runModal() crashing when called from within the Task.init { } block ?

Is this a bug. I can upload a sample program if required.


    @IBAction func start(_ sender: Any) {

        

        isBusy = true

        log("start")

        

        

        Task.init {

            

            log("sync start")

            let (result, message) = await asyncObj.process(5, progress: progressCallback)

            isBusy = false

            log(message)

            log("sync end")  // Reports as running in main thread

            

            

            // CRASHES HERE !

            alert = self.dialogOK(question: "Some question", text: "Some thing else")

            

            log("task end") // Reports as running in main thread

        }

        

    }

    

    func dialogOK(question: String, text: String) -> NSAlert {

        let alert = NSAlert()

        alert.messageText = question

        alert.informativeText = text

        alert.alertStyle = .warning

        alert.addButton(withTitle: "OK")

        return alert //.runModal() == .alertFirstButtonReturn

    }



    /// This process MUST run on a background thread - it cannot run on the main thread

    /// So how do I force it to run on a background thread ?

    func process(_ count: Int, progress: @escaping (Double)->Void) async -> (Bool, String)  {

        

        // Still on the main thread here ??

        log("1 First part on the main thread ??")

        

        let task = Task.detached { () -> (Bool, String) in

            

            //Thread.sleep(forTimeInterval: 0.1)

            log("2 Run a loop in the background")

            log("  Thread: \(Thread.isMainThread ? "UI" : "BG")")

            

            var cnt = 0

            for i in 0..<count {

                Thread.sleep(forTimeInterval: 0.025)// sleep(seconds: 0.1)

                log("  i: \(i)")

                cnt += 1

                progress (Double(cnt)/Double(count)*100)

                

            }

            log("  >>>>")

            

            return (true, "Background task Done")

            

        }

        

        let result = await task.value

        

        log("2 First part on the main thread ??")

        return result

        

    }