我有一個類,它應該表現出一些信息給用戶,當一些操作的狀態改變時,這樣的:創建異步線程內的物體引起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'提供的答案。 –