2012-08-16 9 views

Antwort

14

Nun, wenn Sie MVVM Light Toolkit in Ihrer Anwendung verwenden, können Sie CheckBeginInvokeOnUI (Aktion Aktion) Methode der GalaSoft.MvvmLight.Threading.DispatcherHelper Klasse verwenden, die automatisch diese Situation behandelt.

GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
{ 
    Gui.Property = SomeNewValue; 
}); 



Edit:

Der folgende Code basiert auf DispatcherHelper Klasse von MVVM Light Toolkit - link


Aber wenn Sie nicht MVVM Light (die die übrigens ziemlich coole Sache ist) verwenden möchten, können Sie so etwas wie dieses (sorry versuchen, kann nicht überprüfen, ob das funktioniert, müssen nicht Windows 8):

var dispatcher = Window.Current.Dispatcher; 

if (dispatcher.HasThreadAccess) 
    UIUpdateMethod(); 
else dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => UIUpdateMethod();); 


es wäre schöner, diese Logik in separate Klasse setzen wie folgt aus:

using System; 
using Windows.UI.Core; 
using Windows.UI.Xaml; 

namespace MyProject.Threading 
{ 
    public static class DispatcherHelper 
    { 
     public static CoreDispatcher UIDispatcher { get; private set; } 

     public static void CheckBeginInvokeOnUI(Action action) 
     { 
      if (UIDispatcher.HasThreadAccess) 
       action(); 
      else UIDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
             () => action()); 
     } 

     static DispatcherHelper() 
     { 
      if (UIDispatcher != null) 
       return; 
      else UIDispatcher = Window.Current.Dispatcher; 
     } 
    } 
} 


Dann können Sie es gerne verwenden:

DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod()); 
+2

Ich denke, das funktioniert, aber es wäre nett, wenn jemand eine Lösung kennt, die keine Bibliothek von Drittanbietern erfordert. – Nilzor

+0

Ich habe Kommentar bearbeitet, schau es dir an. – Oleg

+0

Vielen Dank. Ich denke, die Window.Current.Dispatcher.HasThreadAccess bool ist der Schlüssel. – Nilzor

3

Sie können auf den Haupt-ui-Thread über CoreApplication.Window zugreifen, z.

if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess) 
      { 
       DoStuff(); 
      } 
      else 
      { 
       await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
       { 
        DoStuff(); 
       }); 
      } 
Verwandte Themen