UWP aggiorna l’interfaccia utente dall’attività

Ho un’applicazione, che controlla gli intervalli di rete (per l’esecuzione del servizio http) nella rete locale.

Quindi significa che sto controllando fe da 10.0.0.1 a 10.0.0.255. Ed ecco il problema, quando si esegue su PC, la velocità è sufficiente, ma quando si esegue su Lumia 950 la velocità non è sufficiente. Quindi mi piacerebbe aggiornare l’interfaccia utente durante la scansione.

Quindi ecco le domande:

  1. In questo momento ho diversi compiti 10 – ogni attività sta analizzando il suo range fe compito 1 – 10.0.0.1 a 10.0.0.25 ecc. – Dovrei usare 10 compiti o c’è un modo, come .net lo risolverà da solo ? Quale sarà la performance, se userò 50 compiti?

  2. Seconda domanda è, durante la scansione troverò il PC, dove funziona il servizio web, ma … Come dovrei aggiornare l’IU quando il PC viene trovato? In questo momento sono solo in grado di farlo, quando tutti i compiti sono finiti ..

I metodi che sto chiamando sono Task asincroni

  1. Puoi utilizzare tutte le attività che desideri, il sistema eseguirà automaticamente l’accodamento e l’esecuzione per te. Questo è uno dei vantaggi dell’utilizzo dei meccanismi integrati

  2. Per eseguire il codice sul thread dell’interfaccia utente è ansible utilizzare il dispatcher in questo modo:

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

Per eseguire il codice sul thread dell’interfaccia utente e si desidera solo aggiornare la proprietà. È ansible utilizzare MVVM e l’ereditarietà ViewModel della class

 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)); }); } } 

E tutte le proprietà che il bind Xaml usa oneway o twoway e nella proprietà usano OnPropertyChanged (); E se è il momento in cui il mio codice è valido e dico che Current is null

Puoi usare

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

Se hai scritto il codice nel controllo utente o in una pagina puoi vedere il codice sottostante.

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

Il CoreDispatcherPriority può impostare Priority ma non lo si dovrebbe impostare su High, vedere CoreDispatcherPriority

Ho anche trovato un’altra possibilità su come aggiornare l’interfaccia utente – in questo momento sto aggiornando la barra di avanzamento in questo modo, ma ho scoperto che puoi passare altre variabili ..

  var progress = new Progress(i => _progress = i); progress.ProgressChanged += Pr_ProgressChanged; 

quindi evento:

  private void Pr_ProgressChanged(object sender, int e) { progressBar1.Value = progressBar1.Value + 1; } 

Metodo con parametri:

  public async Task GetWebServers(IProgress progress) { //your code } 

Calling:

 await Task.WhenAll(workers.Select(webServer => webServer.GetWebServers(progress)) );