it-swarm.com.de

Führen Sie Code auf dem UI-Thread in WinRT aus

Wie kann ich in WinRT (Windows 8 Metro) Code auf dem UI-Thread ausführen?

Die Invoke-Methode existiert nicht.

64
ofer

Es ist einfacher, das CoreWindow direkt vom Nicht-UI-Thread abzurufen. Der folgende Code funktioniert überall, auch wenn GetForCurrentThread() oder Window.Currentnull zurückgibt.

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    <lambda for your code which should run on the UI thread>);

zum Beispiel:

CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () =>
    {
        // Your UI update code goes here!
    });

Sie müssen auf Windows.ApplicationModel.Core-Namespace verweisen:

using Windows.ApplicationModel.Core;
77
Cœur

Benutzen:

Führen Sie in Ihrem UI-Thread Folgendes aus:

var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;

Von Ihrem Hintergrund (nicht UI-Thread)

dispatcher.RunAsync(DispatcherPriority.Normal, 
    <lambda for your code which should run on the UI thread>);

Das sollte auf CP und späteren Builds funktionieren.

69
Larry Osterman

Benutzen:

this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(Welcome), this));

Für mich geht das.

8

Dies ist meiner Meinung nach viel einfacher.

Rufen Sie den TaskScheduler ab, der der Benutzeroberfläche zugeordnet ist.

    var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext();

Starten Sie dann eine neue Task und auf den obigen UISyncContext.

    Task.Factory.StartNew(() => { /* Do your UI stuff here; */}, new System.Threading.CancellationToken(), TaskCreationOptions.PreferFairness, UISyncContext);
5
Deeb

DispatcherTimer ist auch eine Option.

Ich habe es für Code verwendet, der in Xaml-Designer ausgeführt werden muss (CoreWindow.Dispatcher, ... sind nicht in UWP-Designer verfügbar)

var localTimer = new DispatcherTimer
{
    Interval = TimeSpan.FromMilliseconds(0)
};
localTimer.Tick += (timer, e) =>
{
    (timer as DispatcherTimer).Stop();
    action();
};
localTimer.Start();

Haftungsausschluss:
Ich sollte beachten, dass dies eine Option für den letzten Ausweg sein sollte, wenn jeder andere ausfällt.

0

Bei UWP hatte ich ein Problem beim Festlegen der Source-Eigenschaft des CaptureElement-Steuerelements (das in XAML definiert ist). Es beschwerte sich, dass es in einem anderen Thread vorbereitet wurde, obwohl ich versuchte, es aus einem Code zu setzen, der über ein PageLoaded aufgerufen wurde Eventhandler. Am Ende habe ich damit umgegangen:

previewControl.Dispatcher.TryRunAsync(CoreDispatcherPriority.Normal, () => {
   previewControl.Source = _mediaCapture;
}).GetAwaiter().GetResult();
0
George Birbilis