我正在尝试添加加载覆盖,而我的应用程序在后台线程中调用web api服务但由于某种原因它无法正常工作。当我使用以下代码时,它按预期工作:
Task.Factory.StartNew (
() => {
Console.WriteLine ( "Hello from taskA." );
System.Threading.Thread.Sleep(3000);
}
).ContinueWith (
t => {
loadingOverlay.Hide();
}, TaskScheduler.FromCurrentSynchronizationContext()
);
上面的代码写入控制台,然后按预期睡眠3秒,然后删除叠加层。但是,当我向存储库添加一个调用时,它会跳过整个第一部分并隐藏覆盖。
新代码如下所示:
Task.Factory.StartNew (
() => {
Console.WriteLine ( "Hello from taskA." );
var user = userRepository.GetUserByEmail(EmailTextBox.Text);
System.Threading.Thread.Sleep(3000);
}
).ContinueWith (
t => {
loadingOverlay.Hide();
}, TaskScheduler.FromCurrentSynchronizationContext()
);
};
存储库中的代码如下:
using (var client = new HttpClient ()) {
client.BaseAddress = _uri;
client.DefaultRequestHeaders.Accept.Clear ();
client.DefaultRequestHeaders.Accept.Add (new MediaTypeWithQualityHeaderValue ("application/json"));
HttpResponseMessage response = client.GetAsync(String.Format("GetUser?email={0}", email)).Result;
if (response.IsSuccessStatusCode) {
var jsonResponse = response.Content.ReadAsStringAsync ().Result;
return JsonConvert.DeserializeObject<User> (jsonResponse);
} else {
return null;
}
}
任何帮助将不胜感激 - 提前感谢
答案 0 :(得分:0)
你可以使用await&amp; amp;异步关键字。
var user = await userRepository.GetUserByEmail(EmailTextBox.Text);
loadingOverlay.Hide();
await关键字只表示您在排除下一个代码行之前等待GetUserByEmail的回答。
您需要对此行执行相同的操作,而不是 .Result
HttpResponseMessage response = await client.GetAsync(String.Format("GetUser?email={0}", email));
不要忘记在您的网络通话方法上添加async关键字。
使用此await关键字,您需要在使用await关键字的方法中添加async。
更多关于async&amp;等待:https://msdn.microsoft.com/en-us/library/hh191443.aspx