我有一个应用程序,它正在检查网络范围(用于运行http服务)在本地网络
这意味着,我正在检查从10.0.0.1到10.0.0.255的f.e.。问题是,在PC上运行时,速度足够了,但在Lumia 950上运行时速度不够。所以我想在扫描期间更新UI。
问题如下:
-
在这一刻,我有几个任务f.e. 10 -每个任务都在扫描他的范围f.e.任务1 - 10.0.0.1到10.0.0.25等。-我应该使用10个任务还是有一些方法,如何。net将解决它自己?如果我使用50个任务,性能会如何?
-
第二个问题是,在扫描期间,我会找到PC, web服务正在工作,但是…找到电脑后,我该如何更新UI ?当所有的任务都完成后,我此刻只能做这件事。
我调用的方法是异步任务
-
你可以使用任意多的任务,系统会自动为你排队和执行。这是使用内置机制的优点之一
-
要在UI线程上执行代码,你可以像这样使用分派器:
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { //UI code here });
要在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));
});
}
}
所有的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可以设置Priority,但你不应该将其设置为High,参见CoreDispatcherPriority
我还发现了另一种可能性如何更新UI -此时我正在更新进度条通过这种方式,但发现你可以传递其他变量。
var progress = new Progress<int>(i => _progress = i);
progress.ProgressChanged += Pr_ProgressChanged;
then event:
private void Pr_ProgressChanged(object sender, int e)
{
progressBar1.Value = progressBar1.Value + 1;
}
参数:
public async Task GetWebServers(IProgress<int> progress) {
//your code
}
调用:await Task.WhenAll(workers.Select(webServer => webServer.GetWebServers(progress))
);