2016-12-20 4 views
3

Ich habe eine C# UWP-App, die eine Funktion enthält, die ich alle 5 Sekunden aufrufen möchte. Die Funktion läuft gut, wenn sie von einer Taste aus aufgerufen wird, und der Timer schreibt alle 5 Sekunden in die Debug-Konsole. Wenn ich die Funktion vom Timer aus anrufe, bricht alles aus. Ich bekomme diese:C# UWP Die Anwendung hat eine Schnittstelle aufgerufen, die für einen anderen Thread gemarshallt wurde.

System.Exception wurde nicht behandelt durch Benutzercode HResult = -2147417842 Message = Die Anwendung eine Schnittstelle genannt, die für einen anderen Thread gemarshallt wurde. (Ausnahme von HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

+0

Welche Art von Timer verwenden Sie? – CodingYoshi

Antwort

0

Höchstwahrscheinlich verwenden Sie eine Timer von System.Threading. Die Ereignisse dieses Timers werden nicht wie ein normales GUI-Ereignis behandelt. Wenn Sie auf ein GUI-Element der von diesem Timer aufgerufenen Methode zugreifen, führt dies zu Problemen, da dieser Thread nicht der Eigentümer des GUI-Elements ist.

Verwenden Sie eine Timer von System.Windows.Forms. Dieser Timer hat Zugriff auf Ihre GUI-Elemente.

+0

Korrigieren Sie im Prinzip, aber System.Windows.Forms in einer UWP-App scheint unwahrscheinlich. – spender

+0

@spender Sie meinen, es ist nicht in UWP verfügbar? – CodingYoshi

5

Ich nehme an, Ihre Funktion berührt die Benutzeroberfläche der App. Alles, was die Benutzeroberfläche berührt, muss auf dem Dispatcher-Thread der Benutzeroberfläche ausgeführt werden (die meisten Apps haben nur eine, bis Sie in mehrere Apps gelangen).

Sie können eine Windows.UI.Xaml verwenden. DispatcherTimer, um Ihren Timer im Dispatcher-Thread auszuführen.

Wenn Sie Code für einen Worker-Thread ausführen und dann im Dispatcher-Thread auf UI tippen, können Sie den Dispatcher aufrufen. RunAsync, um einen Rückruf auf den Dispatcher-Thread zu vermitteln.

Sie können Ihren Dispatcher im Allgemeinen über Ihr Fenster unter Window.Dispatcher finden.

var ignored = Window.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
{ 
    // Do something on the dispatcher thread 
}); 
Verwandte Themen