2016-12-20 21 views
3

我有一個C#UWP應用程序,其中包含一個函數,我想每5秒鐘調用一次。 當從一個按鈕調用時,函數運行正常,並且Timer每5秒鐘向調試控制檯寫入罰款....當我從Timer調用函數時,所有heck都會打散。我得到這個:C#UWP該應用程序稱爲一個接口,被編組爲一個不同的線程

System.Exception被用戶代碼未處理 HResult = -2147417842 Message =應用程序調用了一個接口,該接口被編組爲另一個線程。 (來自HRESULT的異常:0x8001010E(RPC_E_WRONG_THREAD))

+0

您使用的是什麼類型的計時器? – CodingYoshi

回答

0

很有可能您使用TimerSystem.Threading。該計時器的事件不像普通的GUI事件那樣被處理,並且如果您正在訪問由該計時器調用的方法的GUI項目,它將引起問題,因爲該線程不是GUI項目的所有者。

使用TimerSystem.Windows.Forms。該計時器可以訪問您的GUI項目。

+0

原則上正確,但UWP應用程序中的System.Windows.Forms似乎不太可能。 – spender

+0

@spender你的意思是它在UWP中不可用? – CodingYoshi

5

我假設你的功能觸及了應用的用戶界面。觸及UI的任何東西都需要在UI的調度程序線程上運行(大多數應用程序只有一個,直到進入多個窗口應用程序)。

您可以使用Windows.UI.Xaml。 DispatcherTimer在調度程序線程上運行您的計時器。

如果您需要在工作線程上運行代碼,然後在調度程序線程上觸摸UI,則可以調用Dispatcher。 RunAsync將一個回調編組回調度器線程。

您通常可以通過Window.Dispatcher從您的窗口找到您的調度員。

var ignored = Window.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
{ 
    // Do something on the dispatcher thread 
}); 
相關問題