2016-07-29 33 views
1

Ich versuche 100 Nachrichten an eine Web-API aus einer Konsolenanwendung zu senden. Das Programm wird jedoch beendet, bevor die Nachrichten an die Web-API gesendet werden. Wenn ich am Ende Console.ReadLine(); setze, funktioniert es. Kann mir jemand bei diesem Problem helfen?HttpClient PostAsync-Aufruf in der Konsolenanwendung wird nicht abgeschlossen

Ich habe den Code, den ich unten verwendet habe, gepostet.

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

private static void CreateLog() 
{ 
    for(int i=0;i<100;i++) 
    ProcessLog(new LogMessage() { });   
} 

private static void ProcessLog(LogMessage message) 
{ 
    //Post message to web service 
    HttpClient client = new HttpClient(); 
    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

Der Prozess wird beendet, bevor alle Threads ihre Arbeit getan haben. Wenn der Prozess alle Threads beendet, fährt er herunter. Die einzige Möglichkeit, die Sie haben, besteht darin, zu warten, bis diese Aufgabe abgeschlossen ist. Dazu kann die Methode Wait verwendet werden.

var result = client.PostAsync("api/xxx", contentPost); 
result.Wait(); 

EDIT

Wenn Sie wollen, warten einige Aufgaben parallel und dann laufen, damit sie dich finsish ContinueWhenAll verwenden können.

List<Task> tasks = new List<Task>(); 
for(bla; bla; bla) { 
    //run client posts async 
    tasks.Add(client.PostAsync(bla, bla)); 
} 
XYZ() 
Task.Factory.ContinueWhenAll(tasks.ToArray(), (Task[] tasks) => { 
    // run action when all are done 
}); 

Oder Sie können die WaitAll oder WhenAll Methode verwenden.

XYZ() 
Task.WaitAll(tasks.ToArray()): 
// or 
await Task.WhenAll(task.ToArray()); 

Weitere Details zu diesen beiden Methoden finden Sie unter here.

+0

Wenn ich result.wait() verwende, wird es nicht mehr asynchron sein. – Gangz

+0

ja. Das Problem hierbei ist jedoch, dass Ihre asynchrone Aktion immer noch ausgeführt wird, wenn der Prozess endet, was bedeutet, dass die Aktion unterbrochen wird. Irgendwann musst du auf den Thread warten. – NtFreX

+0

ok.Wenn eine Methode XYZ() wie folgt aufgerufen wird für (int i = 0; i <100; i ++) { ProcessLog (neue LogMessage() {}) ; } XYZ(); Die XYZ() - Methode muss warten, bis alle 100 Nachrichten erfolgreich hochgeladen wurden. Wie kann ich mit XYZ() fortfahren, während alle Nachrichten verarbeitet werden? – Gangz