c# - page - UWP actualizar la interfaz de usuario de la tarea
uwp navigate to page (3)
Tengo una aplicación, que verifica los rangos de red (para ejecutar el servicio http) en la red local.
Entonces significa que estoy comprobando fe desde 10.0.0.1 a 10.0.0.255. Y aquí está el problema, cuando se ejecuta en PC, la velocidad es suficiente, pero cuando se ejecuta en Lumia 950, la velocidad no es suficiente. Por lo tanto, me gustaría actualizar la interfaz de usuario durante el escaneo.
Así que aquí están las preguntas:
-
En este momento tengo varias tareas fe 10 - cada tarea está escaneando su rango fe tarea 1 - 10.0.0.1 a 10.0.0.25 etc. - ¿Debo usar 10 tareas o hay alguna forma, cómo el .net lo resolverá por sí mismo? ? ¿Cuál será el rendimiento, si usaré 50 tareas?
-
La segunda pregunta es, durante el análisis, encontraré la PC, donde funciona el servicio web, pero ... ¿Cómo debo actualizar la IU cuando se encuentra la PC? En este momento solo puedo hacerlo, cuando todas las tareas están terminadas ...
Los métodos a los que llamo son tareas asincrónicas
-
Puede utilizar tantas tareas como desee, el sistema realizará automáticamente colas y ejecución por usted. Esa es una de las ventajas de utilizar los mecanismos integrados.
-
Para ejecutar código en el hilo de la interfaz de usuario, puede usar el despachador de esta manera:
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { //UI code here });
Para ejecutar código en el subproceso de la interfaz de usuario y solo desea actualizar la propiedad. Puede usar MVVM y la herencia ViewModel de la clase
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));
});
}
}
Y todas las propiedades que el enlace Xaml usa en un sentido o en dos direcciones y en la propiedad usan OnPropertyChanged ();
Y si es el momento de mi código de excepción y decir que
Current is null
Puedes usar
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
//write your code
//in OnPropertyChanged use PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
});
Si escribió el código en el control de usuario o en una página, puede ver el código a continuación.
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
//UI code here
});
CoreDispatcherPriority puede establecer Priority pero no debe establecerlo en High, consulte CoreDispatcherPriority
También encontré otra posibilidad de cómo actualizar la interfaz de usuario: en este momento estoy actualizando la barra de progreso de esta manera, pero descubrí que puede pasar otras variables.
var progress = new Progress<int>(i => _progress = i);
progress.ProgressChanged += Pr_ProgressChanged;
entonces evento:
private void Pr_ProgressChanged(object sender, int e)
{
progressBar1.Value = progressBar1.Value + 1;
}
Método con parámetros:
public async Task GetWebServers(IProgress<int> progress) {
//your code
}
Vocación:
await Task.WhenAll(workers.Select(webServer => webServer.GetWebServers(progress))
);