2017-02-20 12 views
1

У меня есть случай, когда я сделаю повторный вызов и на основе ответа я сохраню его в базе данных.Сохранение вызова и базы данных Сохранение с использованием C# Async Ожидание не работает

private async Task<bool> ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id) 
{ 
    string mainId = null,intermediateId = null; 

    var tasks = t.Select(async item => 
    { 
     var response = await CallRestApi(item,(long)(pi.GetValue(item)),name,id); 

     //Saving Rsult based on RestAPi result 
     // Requiremnt is wait until databse operation finishes 
     await this.SaveToTable(response.id,name,id)); 

    }); 
    await Task.WhenAll(tasks); 

    return await Task.FromResult(false); 
} 

private async Task<string> SaveToTable(int responseId,name,id) 
{ 
    //Save details in Audit Table 
    _iDataAccess.AuditSave(responseId,name,id); 
    return await Task.FromResult("Success"); 
} 

public async Task<ResponseResult> CallRestApi<T>(T itemObj,id,name) 
{ 
    //Fetching From DB 
    var info = await fetchDetailsFromDB(id, name); 
    //Rest Api Call 
    return await CreateNewEntryByRestCall<T>(itemObj,info.name); 
} 

Но ProcessParallal оленьей кожи ждать до операции базы данных отделок (т.е. SaveToTable метод) .ProcessParallal метод возвращает до операции базы данных завершается.

Можно ли указать проблему с этим кодом ..

+0

Что происходит, когда вы устанавливаете .ToList() на конец выбора? т. Е. Var tasks = t.Select (async item => ...). ToList(); – peinearydevelopment

+0

@peinearydevelopment .. Это имеет значение. Я буду тестировать. – vmb

+1

Невозможно воспроизвести эту проблему. Вы уверены, что ProcessParallal возвращается до того, как метод SaveToTable будет завершен? .. Можете ли вы снова проверить, возможно, вы можете поместить некоторые журналы. –

ответ

0

Если я понимаю вас вопрос правильно с ожиданием от метода ProcessParallal, ваш асинхронный вызов

private async Task<bool> ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id) 

должен затем быть изменен синхронный вызов:

private bool ProcessParallal<T>(IList<T> t,PropertyInfo pi, string name, int Id) 
Смежные вопросы