我的MainPage隐藏代码:
private void Button_Clicked(object sender, EventArgs e)
{
Query().Wait();
App.Current.MainPage = new Categories();
}
public async Task Query()
{
restaurantsClient = (App.Current as App).restaurantsClient;
try
{
var restaurantsNames = await restaurantsClient.GetCatalogsAsync(1);
}
catch (Exception ex)
{
var x = 0;
}
}
我也尝试过此代码,但没有用,发生同样的问题:
async static Task GetRequest(String URL)
{
using (HttpClient client = new HttpClient())
{
// As soon as I try to step over (or even into) this next line, it crashes.
using (HttpResponseMessage response = await client.GetAsync(URL))
{
using (HttpContent content = response.Content)
{
string data = await content.ReadAsStringAsync();
Console.WriteLine(data);
}
}
}
}
C#中的Rest-API:
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
当项目到达此行时,它只会死而不会显示任何错误。 如果我在浏览器中执行此操作,它将正常工作。 该API在我的PC上本地运行(我正在使用Conveyor公开API)。
好吧,我制作了一段视频,以更好地了解我在说什么: https://youtu.be/ONKTipPsEXI 如您所见,我在响应行中单击“下一步”后,停止执行其余代码。
答案 0 :(得分:1)
那是因为您在UI线程上使用.Wait()
的{{1}}(UI线程处理了Task
事件),导致死锁。 任务正在等待UI线程给予控制权,而UI线程正在等待任务完成。解决方案是在事件处理程序中添加Button.Clicked
修饰符,并使用async
代替await Query()
。
Query().Wait()
我还建议阅读 Stephen Cleary 的this article,以解决此问题。此外,他制作了一系列有关C#任务的精彩文章(A Tour of Task)。
更新:
更新OP的问题并在此答案的评论中进行讨论之后;他认为这是有问题的,因为他可以在private async void Button_Clicked(object sender, EventArgs e)
{
await Query();
App.Current.MainPage = new Categories();
}
的结尾之前到达GetCatalogsAsync(int)
的结尾。这是完全自然的,是可以预期的。解决方案:
GetCatalogsAsync(int, CancellationToken)