在异步线程内创建对象会导致STA异常

本文关键字:STA 异常 创建对象 异步 线程 | 更新日期: 2023-09-27 18:06:12

我有一个类,它应该在某些操作的状态发生变化时向用户显示一些消息,如下所示:

public static class AutoUpdater
    {
        public static async void AutoUpdateCheck()
        {
            UpdaterStatus.CurrentUpdateStatus = await UpdaterLogic.CheckForUpdateAsync();
        }
        public static void OnStatusChanged()
        {
                switch (UpdaterStatus.CurrentStatus)
                {
                    case UpdateStatus.UpdateFound:
                        {
                            Message ToAdd = new Message("some params"); //Exception here
                            MessagesManager.AddNewMessage(ToAdd);
                            break;
                        }
                    //some other cases
                }
        }

当应用程序启动时,我订阅AutoUpdater到这样的事件:

UpdaterStatus.EventStatusChanged += (sender, args) => { AutoUpdater.OnStatusChanged(); };

我得到的例外是:"调用线程必须是STA,因为许多UI组件需要这个"。

然而,我不能自己创建STA线程,然后将新创建的消息添加到它的父控件,因为这样我会得到一个异常,说"该对象属于另一个线程"。

有什么解决办法吗?

在异步线程内创建对象会导致STA异常

你应该从UI线程创建UI控件。你可以尝试在这里使用dispatcher

Application.Current.Dispatcher.Invoke(/* your action here*/ () => {/* creating UI controls */});

按如下方式更新函数

public void OnStatusChanged()
    {
        if (this.Dispatcher.CheckAccess())
        {
            switch (UpdaterStatus.CurrentStatus)
            {
                case UpdateStatus.UpdateFound:
                    {
                        Message ToAdd = new Message("some params"); //Exception here
                        MessagesManager.AddNewMessage(ToAdd);
                        break;
                    }
                //some other cases
            }
        }
        else
            this.Dispatcher.Invoke(new Action(OnStatusChanged));
    }