pet*_*tim 11 c# user-interface task uwp
我有应用程序,它检查本地网络中的网络范围(用于运行http服务).
所以这意味着,我正在检查从10.0.0.1到10.0.0.255的fe.这就是问题,当在PC上运行时,速度已经足够了,但是当在Lumia 950上运行时,速度还不够.所以我想在扫描期间更新UI.
所以这里是问题:
此时我有几个任务10 - 每个任务都在扫描他的范围fe任务1 - 10.0.0.1到10.0.0.25等. - 我应该使用10个任务还是有某种方式,.net将如何解决它本身?如果我将使用50个任务,那将是什么表现呢?
第二个问题是,在扫描期间,我会找到PC,Web服务正在工作,但是...当找到PC时,我应该如何更新UI?此时我只能在完成所有任务后才能这样做.
我调用的方法是异步任务
Ale*_*nea 37
您可以根据需要使用任意数量的任务,系统将自动为您执行排队和执行.这是使用内置机制的优势之一
要在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)
| 归档时间: |
|
| 查看次数: |
21819 次 |
| 最近记录: |