2016-03-18 3 views
-1

, ben bu gerçek senaryoda konuda okudu mantıklı istiyorumbu WPF örnekte zaman uyumsuz ve bekliyor kullanarak yanlış olan nedir? 'I don, ben 1-2 saniye sürer fiyata Bitcoin okur basit bir kod var</p> <p>: Ben asenk bekliyor yeniyim

public class BitcoinPrice : IPriceRetrieve 
{ 
    public BitcoinPrice() 
    { 
     Url = "https://www.google.com/search?q=bitcoin%20price"; 
    } 

    public string Url { get; } 


    public string GetStringPrice() 
    { 
     var html = RetrieveContent(); 
     html = MetadataUtil.GetFromTags(html, "1 Bitcoin = ", " US dollars"); 
     return html; 
    } 

    public float GetPrice() 
    { 
     throw new NotImplementedException(); 
    } 

    public string RetrieveContent() 
    { 
     var request = WebRequest.Create(Url); 
     var response = request.GetResponse(); 
     var dataStream = response.GetResponseStream(); 
     var reader = new StreamReader(dataStream); 
     var responseFromServer = reader.ReadToEnd(); 
     return responseFromServer; 
    } 
} 
+6

senin soru, bu düşünün "Ne zaman uyumsuz ve kullanma yanlıştır *** bekliyoruz *** Bu WPF örnekte?" Lütfen bana 'bekle' kullanan satırı işaret edin. –

+1

Kendimi aptal hissediyorum .. – RollRoll

+0

'WebRequest 'biraz ağırdır,' public async Task RetrieveContent() {ile tüm RetrieveContent()' nin yerini alabilir ((wc = new WebClient() kullanarak) {return await wc .DownloadStringAsync (URL); }} 'daha sonra getStringPrice öğesini" var html = "RetrieveContent();" –

cevap

6

Kodunuz şu anda:

istendiği gibi
private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Task<int> bitcoinPriceTask = GetBitcoinPrice(); 
     lblStatus.Content = "Loading..."; 
    } 

    protected async Task<int> GetBitcoinPrice() 
    { 
     IPriceRetrieve bitcoin = new BitcoinPrice(); 
     string price = bitcoin.GetStringPrice(); 
     txtResult.Text = price; 
     lblStatus.Content = "Done"; 
     return 1; 
    } 

, burada BitcoinPrice sınıfının uygulamasıdır: yüklenmekte veya bitmiş ise t zaman uyumsuz bekliyor ve hala statü vermek kullanarak arayüzde kilitlemek isteyen çok sorun var, her şeyden önce sen async ur olay işleyicisi, Task<int> döndüren yönteminizi beklersiniz, ikinci olarak, aramadan önce yükleme yöntemini belirleyebilir ve bu yöntemin tamamlanmasını ve sonuçta çalışma sonuçlarının tamamlanmasını tamamlayacağını beklemek üzere bekleyebilirsiniz. set Done ileti:

private async void button_Click(object sender, RoutedEventArgs e) 
{ 
    lblStatus.Content = "Loading..."; 
    int bitcoinPriceTask = await GetBitcoinPrice(); 
    lblStatus.Content = "Done"; 

} 

protected async Task<int> GetBitcoinPrice() 
{ 
    IPriceRetrieve bitcoin = new BitcoinPrice(); 
    string price = await bitcoin.GetStringPrice(); 
    txtResult.Text = price; 
    return 1; 
} 

veya daha fazla daha iyi Task<string> dönen olması ve olay işleyicisi orada TextBox değerini ayarlayabilirsiniz:

protected async Task<string> GetBitcoinPrice() 
{ 
    IPriceRetrieve bitcoin = new BitcoinPrice(); 
    string price = await bitcoin.GetStringPrice(); 
    return price; 
} 

ve olay işleyicisinde:

private async void button_Click(object sender, RoutedEventArgs e) 
{ 
    lblStatus.Content = "Loading..."; 
    string price = await GetBitcoinPrice(); 
    txtResult.Text = price; 
    lblStatus.Content = "Done"; 

} 
+0

@ScottChamberlain ile başlattığınız şekilde düzenleyin. Teşekkürler. " –

+0

" Daha iyi sürümünüzde ".ConfigureAwait (false)' da 'GetStringPrice()' Eğer, artık 'GetBitcoinPrice()' yöntemi içinde UI dokunma çünkü. –

+0

teşekkürler, bir şey özledim emin değilim ama yine de ui – RollRoll