我有一个类,它应该表现出一些信息给用户,当一些操作的状态改变时,这样的:创建异步线程内的物体引起STA例外
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元素。为消息创建视图模型,并使用数据模板对其进行可视化处理,例如在ItemsControl中。 – Clemens
控件只能从创建它们的线程访问。还应该在UI线程上创建和访问它们。如果你想从另一个线程更新它们,那么你应该使用分派器。请参阅用户'tym32167'提供的答案。 –