繁体   English   中英

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

[英]Creating objects inside async thread causes STA exception

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

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

有没有解决方法?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM