UWP从Task更新UI

我有应用程序,它检查本地网络中的网络范围(用于运行http服务)。

所以这意味着,我正在检查从10.0.0.1到10.0.0.255的fe。 这就是问题,当在PC上运行时,速度已经足够了,但是当在Lumia 950上运行时,速度还不够。 所以我想在扫描期间更新UI。

以下是问题:

  1. 此时我有几个任务10 – 每个任务都在扫描他的范围fe任务1 – 10.0.0.1到10.0.0.25等。 – 我应该使用10个任务还是有某种方式,.net将如何解决它本身? 如果我将使用50个任务,那将是什么表现呢?

  2. 第二个问题是,在扫描过程中,我会找到PC,Web服务正在工作,但是……当找到PC时,我应该如何更新UI? 此时我只能在完成所有任务后才能这样做。

我调用的方法是异步任务

  1. 您可以根据需要使用任意数量的任务,系统将自动为您执行排队和执行。 这是使用内置机制的优势之一

  2. 要在UI线程上执行代码,您可以像这样使用调度程序:

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

要在UI线程上执行代码而您只想更新属性。您可以使用MVVM和ViewModelinheritance该类

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

并且所有属性Xaml绑定使用单向或双向并且在属性中使用OnPropertyChanged(); 如果我的代码表示时间并且说Current is null

您可以使用

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

如果您在用户控件中编写代码或您可以看到以下代码的页面。

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

CoreDispatcherPriority可以设置优先级,但您不应将其设置为高,请参阅CoreDispatcherPriority

我还发现了另一种可能性如何更新UI – 此时我正在通过这种方式更新进度条,但发现你可以传递其他变量..

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

然后事件:

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

带参数的方法:

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

呼叫:

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