web-dev-qa-db-fra.com

UWP update UI from Task

J'ai une application, qui vérifie les plages de réseau (pour exécuter le service http) dans le réseau local.

Cela signifie donc que je vérifie f.e. du 10.0.0.1 au 10.0.0.255. Et voici le problème, lors de l'exécution sur PC, la vitesse est suffisante, mais lors de l'exécution sur Lumia 950, la vitesse n'est pas suffisante. Je voudrais donc mettre à jour l'interface utilisateur pendant l'analyse.

Voici donc les questions:

  1. En ce moment, j'ai plusieurs tâches f.e. 10 - chaque tâche scanne sa portée f.e. tâche 1 - 10.0.0.1 à 10.0.0.25 etc. - dois-je utiliser 10 tâches ou existe-t-il un moyen, comment le .net va-t-il le résoudre lui-même? Quelle sera la performance, p. Ex. si j'utilise 50 tâches?

  2. La deuxième question est, pendant l'analyse, je trouverai le PC, où le service Web fonctionne, mais ... Comment dois-je mettre à jour l'interface utilisateur lorsque le PC est trouvé? En ce moment, je ne peux le faire que lorsque toutes les tâches sont terminées ..

Les méthodes que j'appelle sont des tâches asynchrones

11
petrtim
  1. Vous pouvez utiliser autant de tâches que vous le souhaitez, le système effectuera automatiquement la mise en file d'attente et l'exécution pour vous. C'est l'un des avantages de l'utilisation des mécanismes intégrés

  2. Pour exécuter du code sur le thread d'interface utilisateur, vous pouvez utiliser le répartiteur comme ceci:

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => {
                //UI code here
    });
    
36
AlexDrenea

Pour exécuter du code sur le thread d'interface utilisateur et que vous souhaitez uniquement mettre à jour la propriété. Vous pouvez utiliser MVVM et l'héritage ViewModel de la classe

public abstract class NotifyPropertyChangedBase : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   protected async void OnPropertyChanged([CallerMemberName] string propName = "")
   {
       await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.High,
           () =>
           {
               PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
           });
   }
}

Et toutes les propriétés que la liaison Xaml utilise dans un sens ou dans les deux sens et dans la propriété utilisent OnPropertyChanged (); Et si le temps mon code d'exception et dire que Current is null

Vous pouvez utiliser

await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => 
{
     //write your code
     //in OnPropertyChanged use PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
});

Si vous avez écrit le code dans le contrôle utilisateur ou sur une page, vous pouvez voir le code ci-dessous.

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => 
{
            //UI code here
});

Le CoreDispatcherPriority peut définir la priorité, mais vous ne devez pas le définir sur Élevé, voir CoreDispatcherPriority

14
lindexi