web-dev-qa-db-ja.com

タスクからのUWP更新UI

ローカルネットワークで(httpサービスを実行するために)ネットワーク範囲をチェックしているアプリケーションがあります。

つまり、f.eをチェックしているということです。 10.0.0.1から10.0.0.255ここに問題があります。PCで実行する場合は速度は十分ですが、Lumia 950で実行する場合は速度が十分ではありません。そのため、スキャン中にUIを更新したいと思います。

質問は次のとおりです。

  1. 現時点では、いくつかのタスクがあります。 10-すべてのタスクが範囲をスキャンしています。タスク1-10.0.0.1から10.0.0.25など。-10個のタスクを使用する必要がありますか、それとも.netがそれ自体を解決する方法がありますか?パフォーマンスはどうなりますか? 50個のタスクを使用する場合

  2. 2番目の質問は、スキャン中にWebサービスが機能しているPCを見つけることですが、... PCが見つかったときにUIを更新するにはどうすればよいですか?現時点では、すべてのタスクが完了したときにのみ実行できます。

私が呼び出しているメソッドは非同期タスクです

11
petrtim
  1. 必要なだけタスクを使用できます。システムは自動的にキューイングと実行を実行します。これは、組み込みのメカニズムを使用する利点の1つです。

  2. UIスレッドでコードを実行するには、次のようなディスパッチャを使用できます。

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

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

14
lindexi