[英]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.