2015-07-17 2 views
-1

У меня есть около 10 таблиц SQL, которые мне нужны для извлечения данных, обработки, а затем вставки этих данных в другую таблицу. Я не хочу делать их все параллельно, но я хотел бы использовать все время ввода-вывода.Async Await обработка верхнего уровня

У меня есть функция:

public async Task PromoteAsync() 
    { 
     try 
     { 
      using (HTTransDB transactions = new HTTransDB()) 
      using (ZImportMaster importMaster = new ZImportMaster()) 
      using (ZMasterAddress masterAddress = new ZMasterAddress()) 
      { 
       // Select out non error rows 
       DataTable dt = await HTTransDB.GetValidRowsAsync(this.TableConfig.BatchID, this.TableConfig.SourceTableName); 


       // Do stuff 

       // insert data 
       using (HTTransDB transactionsDB = new HTTransDB()) 
       { 
        int result = await transactionDB.BulkCopyAsync(dt); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      // log exception and re-throw 
     } 
    } 

я запустить эту функцию в цикле Еогеаспа для каждой таблицы:

public async Task PromoteLoad() 
    { 
     // Load each batch 
     foreach (var table in this.Tables) 
     { 
      await table.PromoteAsync(); 
     } 
    } 

Моего вопрос, как я называю эту функцию из не метода асинхронного ? Task.Run? Я не хочу запускать новые потоки, я просто хочу, чтобы процесс продолжал работать, ожидая ввода-вывода.

+2

Вы пробовали 'PromoteLoad()'? – EZI

+1

Какое приложение? Это консольное приложение? Веб-приложение? Приложение WPF/WinForms? Какую еще работу вы ожидаете во время работы IO, и на каком потоке? У вас есть больше кода, который необходимо выполнить после завершения работы async? – sstan

+0

Это работает в службе окон, которая считывает очередь. Я просто хотел бы перейти к следующей таблице, если последний ждет io. – Dave

ответ

0

Вы можете начать асинхронную работу только вызов метода:

var promoteTask = PromoteAsync(); 

Обратите внимание, что возвращаемая задача представляет выполнение этого метода.