2016-08-16 4 views
-1

In meinem Programm habe ich eine Seite mit Viewmodel. Ansichtsmodell ausführt Funktion Update alle 10 sec in einem anderen Thread mit einem Timer:UWP MVVM gleichzeitige ObservableCollection

// in viewmodel ctor 
var timer = new Timer(Update, 0, 10000); 

public ObservableCollection<Tick> Data { get; set; } 

public void Update(object state) 
{ 
    var query = xbtceService.GetAllTicksAsync(); // get data from service 
    query.Wait(); 
    var data = query.Result; 
    if (data.Any()) 
    { 
     dataAccess.SaveItems(data); //save data in database 
    } 

    Data.Clear(); // ERROR, another thread 
    var list = dataAccess.LoadList(); 
    foreach (var item in list) 
    { 
     Data.Add(item); 
    } 
} 

ObservableCollection Auch die zu einem ListView Binded haben Ansichtsmodell. Wie füllt man alle 10 Sekunden ObservableCollection aus einem anderen Thread mit neuen Daten?

Antwort

0

Sie DispatcherTimer verwenden sollten, und wenn die async haben wollen ui verwenden, können Sie

  await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
      { 
       //code 
      }); 
+0

irgendeine Weise Sammlung mit mvvm Mustern zu aktualisieren? –

+0

Sie können ViewModel hinzufügen – lindexi

0

System.Threading.Timer Class bietet einen Mechanismus, ein Verfahren auf einem Threadpool-Thread in bestimmten Intervallen zur Ausführung. Und sobald Sie Data an eine ListView binden, ist Data mit dem UI-Thread verknüpft. In UWP können wir nicht direkt auf den UI-Thread eines Worker-Threads zugreifen. Wie @lindexi gesagt hat, müssen wir CoreDispatcher.RunAsync method verwenden, um die Arbeit am UI-Thread zu planen. Zum Beispiel können Sie Ihre Update Methode wie folgt ändern:

public async void Update(object state) 
{ 
    var query = xbtceService.GetAllTicksAsync(); // get data from service 
    query.Wait(); 
    var data = query.Result; 
    if (data.Any()) 
    { 
     dataAccess.SaveItems(data); //save data in database 
    } 

    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     Data.Clear(); 
     var list = dataAccess.LoadList(); 
     foreach (var item in list) 
     { 
      Data.Add(item); 
     } 
    }); 
} 
Verwandte Themen