UWP从Task更新UI

pet*_*tim 11 c# user-interface task uwp

我有应用程序,它检查本地网络中的网络范围(用于运行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?此时我只能在完成所有任务后才能这样做.

我调用的方法是异步任务

Ale*_*nea 37

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

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

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


lin*_*exi 14

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

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));
           });
   }
}
Run Code Online (Sandbox Code Playgroud)

并且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));
});
Run Code Online (Sandbox Code Playgroud)

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

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

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


pet*_*tim -1

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

 var progress = new Progress<int>(i => _progress = i);
 progress.ProgressChanged += Pr_ProgressChanged;
Run Code Online (Sandbox Code Playgroud)

然后事件:

  private void Pr_ProgressChanged(object sender, int e)
    {
        progressBar1.Value = progressBar1.Value + 1;
    }
Run Code Online (Sandbox Code Playgroud)

方法参数:

 public async Task GetWebServers(IProgress<int> progress) {
 //your code
}
Run Code Online (Sandbox Code Playgroud)

呼叫:

await Task.WhenAll(workers.Select(webServer => webServer.GetWebServers(progress))
       );
Run Code Online (Sandbox Code Playgroud)