2016-04-13 9 views
1

Ich habe ein Problem beim Aufruf der API-Anwendung, die ich in einem anderen Projekt ausgeführt habe. Wenn ich debugge, kann ich sehen, dass der Anruf den richtigen Controller in der API trifft. Nachdem ich auf "Weiter" geklickt habe, hängt es einfach und nichts passiert.client.GetAsync Anruf hängt beim Aufruf der API von wpf

Methode, wo ich den Anruf an die Api machen

public async Task<ObservableCollection<Room>> SearchForAvailableRooms(DateTime from, DateTime to, bool smoke, bool minibar, int rooms, int customers) 
{ 
    ObservableCollection<Room> data = new ObservableCollection<Room>(); 

    // Call api to get rooms 
    var client = new HttpClient(); 
    client.BaseAddress = new Uri("http://localhost:15998/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    // New code: 
    HttpResponseMessage response = await client.GetAsync("api/room"); 
    if (response.IsSuccessStatusCode) 
    { 
     var jsonAsString = await response.Content.ReadAsStringAsync(); 
    } 
    else 
    { 
     throw new ApplicationException(string.Format("Response message is not OK. Issues in action: {0}", "api/room")); 
    } 

    return null; 
} 

Die client.GetAsync ("api/Raum") macht den Anruf an die api, aber nach dosen't es weiter zu erhalten. Die Wenn oder sonst werden nicht geworfen.

habe gelesen, dass der Aufruf der Methode von diesem Stapel Post ein Deadlock (hanging) wird verursacht: Link to the post, etwas zu tun, wo ich den Aufruf der Methode machen

Er erklärt hat. Im Moment benutze ich diese Zeilen die Methode aufzurufen:

var task = _getRoomsService.SearchForAvailableRooms(searchModel.From, searchModel.To, searchModel.Smoke, searchModel.Minibar, searchModel.RoomValue, searchModel.CustomerValue); 
var result = task.GetAwaiter().GetResult(); 
RoomsList = result; 

Kann jeder sehen, was hier falsch sein könnte?

Update:

Was ich habe auch versucht:

RoomsList = await _getRoomsService.SearchForAvailableRooms(searchModel.From, searchModel.To, searchModel.Smoke, searchModel.Minibar, searchModel.RoomValue, searchModel.CustomerValue); 

Das gibt mir einen Fehler -> Await Operator kann nur innerhalb von Asynchron-Methode verwendet werden.

Antwort

2

Sie rufen dies wahrscheinlich auf UI-Thread. Wenn Ihre Methode in client.GetAsync aufruft, wird der Kontext gespeichert, sodass ein Teil nach einem asynchronen Aufruf möglicherweise im selben Kontext ausgeführt wird wie der vorhergehende Teil. Dies geschieht zu Ihrer Bequemlichkeit - nach der Rückkehr von client.GetAsync sind Sie wieder im UI-Thread und können sicher mit den Bedienelementen der Benutzeroberfläche arbeiten.

Aber in diesem Fall, dass Sie Thread Benutzeroberfläche durch den Aufruf blockieren:

task.GetAwaiter().GetResult(); 

So UI-Thread wird blockiert durch diese und nach client.GetAsync beendet hat - es kann nicht wieder zurück auf UI-Thread - daher werden Sie festgefahren. Das ist, wenn es in einfachen Worten erklärt wird.

zu beheben, einfach nicht UI-Thread blockieren (Sie müssen sowieso nicht wichtig):

RoomsList = await _getRoomsService.SearchForAvailableRooms(searchModel.From, searchModel.To, searchModel.Smoke, searchModel.Minibar, searchModel.RoomValue, searchModel.CustomerValue); 
+0

dies versucht hat, es mir sagt, dass Betreiber erwarten kann nur innerhalb von Asynchron-Methode verwendet werden, aber Komische dass meine Methode eine asynchrone Methode ist? – Mikkel

+1

Sie müssen die Methode als async markieren. Angenommen, Sie tun dies in Button-Klick-Handler, dann tun Sie einfach "async void OnButtonClick (Objekt Absender, RoutedEventArgs e)" – Evk

+0

Okay, ich versuche es! abwarten! – Mikkel

Verwandte Themen