【发布时间】:2016-07-05 19:12:20
【问题描述】:
我是 await async 的新手,我想了解我在这个真实场景中对该主题的研究:
我有一个读取比特币价格的简单代码,需要 1-2 秒,我不想使用 await async 锁定 UI,并且在加载或完成时仍然给出状态:
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;
}
根据要求,这里是 BitcoinPrice 类的实现:
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;
}
}
【问题讨论】:
-
想一想,您的问题是“在这个 WPF 示例中使用 Async 和 Await 有什么问题?”请指出使用
await的行。 -
WebRequest有点重,您可以将所有RetrieveContent()替换为public async Task<string> RetrieveContent() { using(var wc = new WebClient()) { return await wc.DownloadStringAsync(Url); } }然后编辑GetStringPrice 以var html = await RetrieveContent();开头
标签: c# async-await