2015-06-03 3 views
0

У меня есть асинхронный метод MyActionAsync, который получает в качестве параметра async Func<int, Task> в качестве обратного вызова.Ответы на вызовы делегатов не выполняются

Метод вызывает асинхронный вызов правильно, но он выполняет этот шаг перед тем, как все await из asynCallback были выполнены.

Это создает некоторые большие проблемы для меня.

Как я/что могу использовать, чтобы убедиться, что подобное await asyncCallback(id) перейдет только после полного выполнения asyncCallback.

public class MyService 
{ 
    public async Task<int> MyActionAsync(int id, Func<int, Task> asyncCallback) 
    { 
     // 1. do something 

     // 2. execute the callback function 
     // Steps over this step after the first await is finished, and not when all of them are finished 
     await asyncCallback(id); 

     // 3. return 
     return id; 
    } 
} 

async Task Test() 
{ 
    Func<int, Task> asyncCallback = 
     async (id) => 
     { 
      var products = await _unitOfWork.Products.Where(p => p.UserId == id).ToListAsync(); 
      var pictures = await _unitOfWork.Pictures.Where(p => p.UserId == id).ToListAsync(); 
     }; 

    MyService service = new MyService(); 

    await service.MyActionAsync(1, asyncCallback); 
} 
+1

Вы уверены, что исключений не будет? –

+1

что заставляет вас думать, что 'asyncCallback' еще не закончен? –

+0

Действительно, у меня была ошибка на одной из строк внутри asyncCallback, и именно по этой причине она не оценила ее полностью. Моя ошибка – Catalin

ответ

0

код кажется нормально

Он должен ждать AsyncCallback быть finnished

Как вы знаете, это не ждать, пока она закончится?

Может быть, кажется, что не ждет, пока это не закончится, потому что отладчик обыкновение шаг в Func при нажатии F11, она шагнет только если поставить точку останова внутри

Другая вещь, которую вы должны проверить это, если исключение выбрасывается изнутри Func

+0

У меня на самом деле была ошибка внутри asyncCallback, и именно по этой причине она не была оценена все линии ожидания – Catalin

0

Метод async возвращает, когда встречается с оператором await и устанавливает ожидаемую асинхронную операцию. Остальная часть метода продолжается после завершения await.

Я не верю, что вы можете пройти через async методов, подобных этому, но если вы введете какие-то Console.WriteLine заявления, вы должны увидеть, чего вы ожидаете.

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