【发布时间】:2019-08-11 04:47:54
【问题描述】:
我正在寻找一些关于如何在 WPF 中处理 Tasks 的建议,并且想知道是否有人可以查看我的代码并指出我做错了什么?
基本上,该应用程序从 UI 中获取一个邮政编码,该邮政编码用于实例化 Task 服务,该服务将获得经度/纬度,可通过实例访问以用于其他服务或 UI 本身。
我想我可能有一个竞争条件,我希望纠正它,因为当设置 ResultTextBlock.Text 时它是零,但是通过实例化我看到了这些值设置。
任何关于Task 实施和接线的建议将不胜感激。
服务代码
class PostcodeService
{
string _result;
string _postcode;
HttpResponseMessage _response;
RootObject rootObject;
public double Latitude { get; private set; }
public double Longitude { get; private set; }
public PostcodeService(string postcode)
{
this._postcode = postcode;
rootObject = new RootObject();
}
public async Task<string> GetLongLatAsync()
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri("https://api.postcodes.io/postcodes/" + this._postcode);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
try
{
_response = await client.GetAsync(client.BaseAddress);
if(_response.IsSuccessStatusCode)
{
//cast result into model and then set long/lat properties which can then be used in the UI
_result = await _response.Content.ReadAsStringAsync();
rootObject = JsonConvert.DeserializeObject<RootObject>(_result);
Longitude = Double.Parse(rootObject.result.longitude.ToString());
Latitude = Double.Parse(rootObject.result.latitude.ToString());
}
}
catch(Exception ex)
{
ex.ToString();
}
}
TaskCompletionSource<string> tc = new TaskCompletionSource<string>(_result);
return tc.ToString();
}
}
界面代码
private void PostcodeButton_Click(object sender, RoutedEventArgs e)
{
_clearStatus();
if (_validatePostcode())
{
Task T1 = Task.Factory.StartNew(async () =>
{
// get long lat from api
_postcode = new PostcodeService(PostcodeTextBox.Text);
await _postcode.GetLongLatAsync();
});
//Race condition?
ResultTextBlock.Text = _postcode.Latitude.ToString();
}
}
【问题讨论】:
-
这可能更适合 CodeReview?
-
我的理解是 CodeReview 是针对有效代码的。
标签: c# wpf asynchronous async-await task