[英]Xamarin.Forms GetAsync stops debugging without error
我的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如您所見,在單擊響應行中的下一步后,停止執行其余代碼。
這是因為您在UI線程上使用Task
的Button.Clicked
.Wait()
(UI線程上處理了Button.Clicked
事件),從而導致死鎖。 任務正在等待UI線程給予控制權,而UI線程正在等待任務完成 。 解決方案是在事件處理程序中添加async
修飾符,並使用await Query()
代替Query().Wait()
。
private async void Button_Clicked(object sender, EventArgs e)
{
await Query();
App.Current.MainPage = new Categories();
}
我還建議您閱讀Stephen Cleary的 這篇文章 。 此外,他制作了關於C#任務的精彩系列( A Tour of Task )。
更新:
在OP的問題更新並在此答案的評論中進行討論之后; 他認為這是有問題的,因為他可以在GetCatalogsAsync(int, CancellationToken)
結束之前到達GetCatalogsAsync(int)
的結尾。 這是完全自然的,是可以預期的。 解:
public async System.Threading.Tasks.Task<CatalogsInCategory> GetCatalogsAsync(int id)
{
return await GetCatalogsAsync(id, System.Threading.CancellationToken.None);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.