2017-11-19 1 views
-1

DispatcherTimer()를 사용하여 매초마다 메서드를 호출하려고합니다. 이 잘 작동하지만 타이머를 업데이트 할 때마다 메서드에서 UI Emements를 업데이트하려고 할 때마다 타이머가 매초마다 매 2 초씩 틱하는 것처럼 보입니다. 업데이트 할 UI 요소가 많을수록 틱 시간이 증가하고 창은 커질 수 없습니다 진드기 사이에서 화면 주위를 끌 수 있습니다.WPF 응용 프로그램 DispatchTimer가 1 초가 아닌 2 초마다 업데이트됩니다.

어떻게 초를 올바르게 업데이트 할 수 있습니까?

데이터를 수신 할 웹 API를 쿼리하고 있습니다. 이것이 문제가 될 수 있을까? 웹 API를

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)'를 호출하십시오. 틱 처리기 async를 선언하십시오. – Clemens

+0

클레멘스 (Clemens)에게 시간을내어 주셔서 감사합니다. 당신은 저에게 해결책을 가르쳐 주셨습니다. 나는 작업 코드를 업데이트하고 게시 할 것이다. –

+0

일반적으로 어떻게 수행해야하는지에 대한 내 편집을 참조하십시오. GetProductTicker는 이미 비동기입니다. Task.Run 필요 없음. – Clemens

답변

0

를 호출

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(); 
} 

방법은 클레멘스는 작업 업데이트 된 코드는 다음과 같습니다 참으로 정확했다.

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(); 
} 
관련 문제