2016-07-07 6 views
2

У меня есть консольное приложение, и я хочу запускать задачи один за другим.Task.Wait() не ждет завершения задачи

Вот мой код:

static void Main() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     Task t = new Task(() => Search(kw)); 
     t.Start(); 
     t.Wait(); 
    } 

    Console.ReadLine(); 
} 

static async void Search(string keyword) 
{ 
    // code for searching 
} 

Проблема заключается в том, что он не ждет первой задачи, чтобы закончить выполнение. Он одновременно запускает последующие задачи.

Я работаю с API с ограниченным курсом, поэтому я хочу делать это один за другим.

Почему он не ждет завершения одного поиска перед тем, как начать следующий поиск?

+0

Метод поиска использует некоторые методы которые должны быть вызваны асинхронно, и я получил ошибку, пытаясь назвать это нормально сначала, поэтому я попробовал это так и работал. – Guerrilla

+0

Также понимайте, что это поведение отлично, вы ожидаете, когда задача завершит метод Async, который будет иметь 'await', который возвращает и' Task Wait', поэтому вы не можете жаловаться –

ответ

10

Ваш метод async просто возвращает void, что означает, что нет простого способа дождаться его завершения. (Вы почти всегда должны избегать использования методов async void.Они действительно доступны только для подписки на события.) Ваша задача просто вызывает Search, и вы ждете, что «я вызвал метод» для завершения. который будет в значительной степени сразу же.

Это не понятно, почему вы используете асинхр вообще, если вы действительно хотите сделать что-то последовательно, но я предлагаю изменения кода, чтобы выглядеть следующим образом:

static void Main() 
{ 
    // No risk of deadlock, as a console app doesn't have a synchronization context 
    RunSearches().Wait(); 
    Console.ReadLine(); 
} 

static async Task RunSearches() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     await Search(kw); 
    }    
} 

static async Task Search(string keyword) 
{ 
    // code for searching 
} 
+0

Кроме того, async void любое исключение может прекратить действие процесс, который не является поведением async Задача –

+0

Спасибо! Функция поиска использует некоторые асинхронные функции, и я немного запутался, как начать все это с основного метода. Я обновил свой код, как вы предлагали, и теперь он отлично работает! Большое спасибо мистер Скит. – Guerrilla

+0

@Jon Skeet for Non Console приложение должно использовать 'Task.WhenAll' для отображения контекста' synchronization' и избегать 'deadlock'? –

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