2017-11-19 16 views
-1

DispatcherTimer()を使用して毎秒メソッドを呼び出そうとしています。これは、タイマーを更新するときはうまく動作しますが、メソッドのUI Emementsを更新しようとするたびに、タイマーは毎秒ではなく2秒ごとにチェックされ、更新するUI要素が増えるとティックタイムも増加しますティックの間で画面の周りをドラッグします。WPFアプリケーションDispatchTimerは、1秒ではなく2秒ごとに更新します。

1秒ごとに正しく更新するにはどうすればよいですか?

私はデータを受信するWeb APIを照会しています。これが問題なのだろうか?

private void btnConnect_Click(object sender, RoutedEventArgs e) 
{ 
    var dispatcherTimer = new DispatcherTimer(); 
    dispatcherTimer.Tick += new EventHandler(DispatcherTimer_Tick); 
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
    dispatcherTimer.Start(); 
}   

private void DispatcherTimer_Tick(object sender, EventArgs e) 
{    
    // Updating the Label which displays the current second 
    lblTime.Content = DateTime.Now.ToString("HH:mm:ss"); 

    lblSizeBTC_USD.Content = "SIZE " + Api.GetProductTicker(productId).Result.size;    

    // Forcing the CommandManager to raise the RequerySuggested event 
    CommandManager.InvalidateRequerySuggested(); 
} 

クレメンス

public static async Task<ProductTicker> GetProductTicker(string productId) 
{ 
    string ts = GetNonce(); 
    string method = "/products/" + productId + "/ticker"; 
    string sig = GetSignature(ts, "GET", method, string.Empty); 
    ProductTicker productTicker; 

    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(baseURL); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Add("CB-ACCESS-KEY", apiKey); 
     client.DefaultRequestHeaders.Add("CB-ACCESS-SIGN", sig); 
     client.DefaultRequestHeaders.Add("CB-ACCESS-TIMESTAMP", ts); 
     client.DefaultRequestHeaders.Add("CB-ACCESS-PASSPHRASE", passphrase); 
     client.DefaultRequestHeaders.Add("User-Agent", userAgent); 
     HttpResponseMessage response = client.GetAsync(method).Result; 
     response.EnsureSuccessStatusCode(); 

     string json = await response.Content.ReadAsStringAsync(); 
     productTicker = JsonConvert.DeserializeObject<ProductTicker>(json); 
    } 

    return productTicker; 
} 
+0

あなたはTask.Resultを使用してはならない:解決策はDispatcherTimer_Tickメソッドの非同期を作ることとGetProductTickerの呼び出しを待つことでした。代わりに 'await client.GetAsync(method)'と 'await pi.GetProductTicker(productId)'を呼び出してください。 tickハンドラ 'async'を宣言します。 – Clemens

+0

Clemensが時間を割いてくれてくれてありがとう、あなたは私にsoloutionを指摘しました。私は作業コードを更新し、ポストします。 –

+0

これを一般的にどのように行うべきか、私のあなたの編集の回答を参照してください。 GetProductTickerは既に非同期です。 Task.Runの必要はありません。 – Clemens

答えて

0

ウェブAPIを呼び出す方法は、作業更新されたコードは以下の通りです確かに正しかったです。

private async void DispatcherTimer_Tick(object sender, EventArgs e) 
{    
    // Updating the Label which displays the current second 
    lblTime.Content = DateTime.Now.ToString("HH:mm:ss"); 

    var productTicker = await Api.GetProductTicker(productId); 

    lblSizeBTC_USD.Content = "SIZE " + productTicker.size;   

    // Forcing the CommandManager to raise the RequerySuggested event 
    CommandManager.InvalidateRequerySuggested(); 
} 
関連する問題