2016-07-29 115 views
1

我試圖從控制檯應用程序向Web api發送100條消息。但是該程序在將消息發送到web api之前就已經結束了。如果我把Console.ReadLine();結束它正在工作。任何人都可以幫助我解決這個問題嗎?控制檯應用程序中的HttpClient PostAsync調用未完成

我已經發布了我在下面使用的代碼。

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); 
} 

回答

0

該進程在所有線程完成其工作之前退出。當進程退出時,其所有線程都關閉到。您擁有的唯一可能性是等待此任務完成其工作。方法Wait可以用來做到這一點。

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

編輯

當你想並行運行一些任務,然後等待他們finsish您可以使用ContinueWhenAll

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 
}); 

或者你可以使用WaitAllWhenAll方法。

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

關於這兩種方法的更多細節可以參見here

+0

如果我使用result.wait(),它將不再是異步的。 – Gangz

+0

是的。但是這裏的問題是當進程結束時異步操作仍在運行,這意味着操作中斷。在某些時候,您必須等待線程。 – NtFreX

+0

ok。如果一個方法XYZ()被調用,像這樣(int i = 0; i <100; i ++){ ProcessLog(new LogMessage(){}) ; } XYZ(); XYZ()方法必須等待,直到所有100條消息都成功發佈。如何在處理所有消息時繼續處理XYZ()。 – Gangz

相關問題