2017-11-10 16 views
-1

サーバーからデータを取得するためのボタンがあり、その後UIのテキストを更新する単純なアプリケーションです。 さらに、私は再び3秒ごとにデータを取得する別のスレッドを開始したいと思います。 以下のコードは、スレッドを作成してUI(バインディング値)を更新する正しい方法ですか? このシナリオでは、デリゲートNoArgDelegateの使用方法に欠点がありますか?または、デリゲートで非同期メソッドを渡すことは悪い考えですか?私はまだデリゲートとディスパッチャーのコンセプトを得ようとしています。デリゲートと非同期メソッドの正しい使い方

private delegate void NoArgDelegate(); 
    public IAsyncCommand GetDataCommand { get; private set; } // binding for a "Get data" button 

    public JustAViewModel() 
    { 
     // ... 
     GetDataCommand = AsyncCommand.Create(() => GetDataAsync()); 

     var fetcher = new NoArgDelegate(ContinuouslyFetchData); 
     fetcher.BeginInvoke(null, null); 
    } 

    public string Value // in xaml: TextValue="{Binding Value}" 
    { 
     get => _value; 
     set 
     { 
      if (_value != value) 
      { 
       _value = value; 
       RaisePropertyChanged("Value"); 
      } 
     } 
    } 

    private async void ContinuouslyFetchData() 
    { 
     while (true) 
     { 
      System.Threading.Thread.Sleep(3000); 
      await GetDataAsync(); 
     } 
    } 

    private async Task<string> GetDataAsync() 
    { 
     Value = await Task.Run(() => DataProvider.GetData()); 
     return Value; 
    } 

答えて

1

BeginInvokeは何を誤解していますか?新しいスレッドは作成されません。

しかし、とにかくスレッドを作成しないでください。周期的に繰り返されるアクションの場合は、タイマーを使用します。

私は非同期Tickイベントハンドラで、DispatcherTimerをお勧めします:

private readonly DispatcherTimer timer; 

public JustAViewModel() 
{ 
    timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(3) }; 
    timer.Tick += TimerTick; 
    timer.Start(); 
} 

private async void TimerTick(object sender, EventArgs e) 
{ 
    Value = await Task.Run(() => DataProvider.GetData()); 
} 
関連する問題