2016-09-07 23 views
3

我有一個類,它應該表現出一些信息給用戶,當一些操作的狀態改變時,這樣的:創建異步線程內的物體引起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線程,然後將新創建的消息添加到其父控件,因爲這樣我得到一個異常,並說「該對象屬於另一個線程」。

有什麼解決方法嗎?

+3

不要創建一個後臺線程的UI元素。爲消息創建視圖模型,並使用數據模板對其進行可視化處理,例如在ItemsControl中。 – Clemens

+0

控件只能從創建它們的線程訪問。還應該在UI線程上創建和訪問它們。如果你想從另一個線程更新它們,那麼你應該使用分派器。請參閱用戶'tym32167'提供的答案。 –

回答

4

您應該從UI線程創建UI控件。您可以嘗試在這裏

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

我想要做的事情是在WinForms項目中,同時也使用WPF控件(消息類)。沒有'Application.Current'這樣的事情,但是,我試圖做的是:Dispatcher.CurrentDispatcher.Invoke(new Action(()=> MessagesManager.AddNewMessage(new Message(「some params」)))) ;'和異常仍然是一樣的,我做錯了什麼? –

+0

你需要找到UI線程的分派器。當你嘗試調用Dispatcher.CurrentDispatcher時,你會得到當前線程的Dispatcher,但當前線程不是UI,這就是爲什麼這不能解決你的問題。 – tym32167

+0

關於Application.Current,你可以試試這個http://stackoverflow.com/questions/35902815/why-does-application-current-null-in-a-winforms-application希望它有幫助。 – tym32167

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

可悲的是,沒有任何東西作爲'this.Dispatcher' –

+0

好吧我忘了你已經使用了靜態方法,所以這是不可用的靜態方法內,而不是你可以使用任何形式或控制對象 –