【发布时间】:2015-05-12 03:28:04
【问题描述】:
我将 App.OnStartup 更改为异步,以便我可以在 Web api 上调用异步方法,但现在我的应用程序不显示它的窗口。我在这里做错了什么:
protected override async void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
HttpResponseMessage response = await TestWebAPI();
if (!response.IsSuccessStatusCode)
{
MessageBox.Show("The service is currently unavailable");
Shutdown(1);
}
this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
}
private async Task<HttpResponseMessage> TestWebAPI()
{
using (var webClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
{
webClient.BaseAddress = new Uri(ConfigurationManager.AppSettings["WebApiAddress"]);
HttpResponseMessage response = await webClient.GetAsync("api/hello", HttpCompletionOption.ResponseContentRead).ConfigureAwait(false);
return response;
}
}
}
如果我对 TestWebAPI 进行异步调用,它会显示正常。
【问题讨论】:
-
您的编码方式意味着您的消息框和/或 MainWindow.xaml 在异步方法完成之前不会出现。
await关键字使所有后续代码行成为任务完成时将执行的延续。如果您详细说明自己尝试做什么,那么有人可以更好地帮助您。 -
如果我不需要,只是试图不显示我的主窗口。因此,如果 Web 服务关闭,请通知用户并关闭。在这种情况下,Web 服务处于活动状态,但我看不到主窗口。
-
我可以通过在 GetAsync 方法上调用 .Result 来使其全部同步,但是我会因此失去任何好处吗?
-
您的代码是按顺序和异步执行的(即 TestWebAPI 是异步的,但
response.IsSuccessStatusCode的测试以及它之后的所有内容都是从TestWebAPI顺序执行的)。您希望您的异步方法在“在后台”执行与它后面的代码相关的——这意味着不使用await。我建议将“异步”添加到方法中,这样更清楚的是调用该方法会异步执行某些操作。
标签: c# wpf asp.net-web-api async-await