2016-07-29 2 views
1

Я пытаюсь отправить 100 сообщений в веб-приложение api из консольного приложения. Но программа заканчивается перед отправкой сообщений в веб-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(); 

EDIT

Если вы хотите, чтобы выполнить некоторые задачи параллельно, а затем ждать их 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 
}); 

Или вы можете использовать WaitAll или WhenAll метод.

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 (новый LogMessage() {}) ; } XYZ(); Метод XYZ() должен ждать до тех пор, пока все 100 сообщений не будут отправлены должным образом. Как я могу перейти к XYZ(), пока все сообщения обрабатываются. – Gangz

Смежные вопросы