Miałem nadzieję, że ktoś może mnie oświecić w kwestii, z którą mam do czynienia w związku z obsługą asynchronizacji/oczekiwania na wyjątki przy pomocy HttpClient. Pisałem jakiś kod, aby zilustrować, i to jest ścięci zarówno na urządzeniu z systemem Windows Phone 8 oraz emulatora:Prawidłowa obsługa wyjątków HttpClient w async/poczekaj
private async void SearchButton_Click(object sender, EventArgs e)
{
try
{
HttpClient client = new HttpClient();
System.Diagnostics.Debug.WriteLine("BEGIN FAULTY REQUEST:");
string response = await client.GetStringAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
System.Diagnostics.Debug.WriteLine("SUCCESS:");
System.Diagnostics.Debug.WriteLine(response);
}
catch (Exception exception)
{
System.Diagnostics.Debug.WriteLine("CAUGHT EXCEPTION:");
System.Diagnostics.Debug.WriteLine(exception);
}
}
dotknięcie przycisku, który wywołuje tę funkcję, produkuje następujące dane wyjściowe w konsoli debuggera, najbardziej interesujący jest te w pogrubioną:
BEGIN WADLIWA WNIOSEK:
wyjątek typu „System.Net.WebException” wystąpił w System.Windows.ni.dll i nie był obsługiwany przed zarządzany/granica natywna
Wyjątek typu „System.Net.WebException” wystąpił w System.Windows.ni.dll i nie był obsługiwany przed zarządzanym/rodzimej granicy
Pierwsza szansa wyjątek typu „system. Net.Http.HttpRequestException”wystąpił w mscorlib.ni.dll
wyjątek typu«System.Net.Http.HttpRequestException»wystąpiło w mscorlib.ni.dll i nie był obsługiwany przed zarządzanym/rodzimej granicy
ZŁO WYJĄTKIEM: (i tutaj wypisuje wyjątek HttpRequestException)
Oczywiście oczekuję błędu w tym przypadku, ponieważ URL, który wywołuję, jest nonsensem. Nie rozumiem tutaj, dlaczego debugger zgłasza, że wyjątki nie są obsługiwane, gdy dane wyjściowe jednocześnie zgłaszają, że wyjątek został przechwycony. Poza tym strona interfejsu użytkownika staje się znacznie mniej responsywna podczas drukowania wyjścia, co wskazuje, że coś jest prawdopodobnie nie w porządku.
Czy to nie jest sposób obsługi wyjątków podczas pracy z asynchronizacją i czekania? Doceniam wszelkie dane wejściowe! Dzięki.
Jeśli chodzi o czas reakcji nie należy uruchamiać długich procesów w przypadku UI. Powinny to być szybkie i długotrwałe procesy powinny być zakończone w innym wątku. Wypróbuj 'BackgroundWorker' http://msdn.microsoft.com/en-us/library/System.ComponentModel.BackgroundWorker.aspx – Harrison