-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;
}
あなたはTask.Resultを使用してはならない:解決策は
DispatcherTimer_Tick
メソッドの非同期を作ることとGetProductTicker
の呼び出しを待つことでした。代わりに 'await client.GetAsync(method)'と 'await pi.GetProductTicker(productId)'を呼び出してください。 tickハンドラ 'async'を宣言します。 – ClemensClemensが時間を割いてくれてくれてありがとう、あなたは私にsoloutionを指摘しました。私は作業コードを更新し、ポストします。 –
これを一般的にどのように行うべきか、私のあなたの編集の回答を参照してください。 GetProductTickerは既に非同期です。 Task.Runの必要はありません。 – Clemens