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

时间:2016-09-07 11:19:06

标签: c# wpf multithreading events

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

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线程,然后将新创建的消息添加到其父控件,因为这样我得到一个异常,说“该对象属于另一个线程

有解决方法吗?

2 个答案:

答案 0 :(得分:4)

您应该从UI线程创建UI控件。您可以尝试在此处使用调度程序

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

答案 1 :(得分:0)

更新您的功能如下

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));
    }