0

Ich habe folgenden Code in der Konsolenanwendung verwendet, Post-Aufrufe sind nicht abgeschlossen, bis ich Console.Read() verwende; am Ende oder client.PostAsync ("api/xxx", contentPost) .wait(). Aber in Web-Anwendung muss ich keine Wait() -Methode verwenden. Ich möchte nicht wait() Methode verwenden. Kann mir jemand mit diesem Problem helfen.Warum ist HttpClient.PostAsync() nicht in Cosnole Application beendet, aber in Webanwendung beendet?

static void Main(string[] args) 
    { 
     CreateLog(); 

    } 
    private static void CreateLog() 
    { 

     for(int i=0;i<100;i++) 
     ProcessLog(new LogMessage() { 
     }); 
     Console.Write("Press Enter to exit"); 
     Console.ReadLine(); 

    } 
    private static void ProcessLog(LogMessage message) 
    { 


     //Post message to web service 
     HttpClient client = new HttpClient(); 
     // ConfigurationSettings.GetConfig("web api") 
     client.BaseAddress = new Uri(@"web api url"); 
     client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json"));     
     HttpContent contentPost = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json"); 
     client.PostAsync("api/xxx", contentPost); 
    } 

Antwort

0

Dies ist ein klassisches Beispiel für eine race condition. Sie zählen darauf, dass dies beendet wird, bevor die Konsolen-App dies tut, aber es gibt keine Garantien (kurz davor, explizit darauf zu warten), dass dies tatsächlich geschieht. In der Tat, mit dem Code, den Sie geschrieben haben, werden Sie fast sicher haben zahlreiche Anrufe, die nicht bis zu dem Zeitpunkt abgeschlossen haben, dass Sie den Console.Write() Anruf erhalten.

Der Unterschied hier ist, dass Ihre Konsole App beendet wird, direkt nachdem Sie eine Taste zum Eingeben drücken. Die Console.Read() dient als ein de facto Wait() - Aufruf, aber es gibt absolut keine Garantie, dass ein Benutzer wirklich lange genug auf alle Aufrufe warten wird, um abzuschließen. Webanwendungen haben einen völlig anderen Lebenszyklus als Konsolenanwendungen, sodass sie nicht unbedingt geschlossen werden, sobald Sie die Anrufe beendet haben.

Sie müssen warten, bis alle Anrufe abgeschlossen sind, bevor Sie beenden.

+0

Ja.Was ist die Lösung für dieses Problem? Und Console.Read() ist ein Workaround, ich möchte es nicht verwenden. – Gangz

+0

Sie müssen warten, bis alle Ihre Anrufe abgeschlossen sind, bevor Sie die Anwendung beenden. – EJoshuaS

+0

Wie ermittelt man, ob es aktive Anrufe gibt? – Gangz