异步委托回调未完全执行

时间:2015-06-03 06:47:27

标签: c# asp.net asynchronous delegates async-await

我有一个异步方法MyActionAsync,它作为参数接收异步Func<int, Task>作为回调。

该方法正确调用asyncCallback,但它在执行asynCallback的所有await之前逐步执行该步骤。

这给我带来了一些大问题。

如何/我可以使用什么来确保类似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);
}

2 个答案:

答案 0 :(得分:0)

代码似乎没问题

它应该等待asyncCallback完成

你怎么知道它不等待它结束?

似乎它似乎没有等到它结束,因为当你按F11时调试器不会进入Func,它只会在你设置一个断点时进入

您应该检查的另一件事是,是否从Func内部抛出了异常

答案 1 :(得分:0)

async方法在遇到await语句后返回,并设置正在等待的异步操作。然后,在await完成后,该方法的其余部分将继续。

我不相信你可以单步执行async这样的方法,但如果你加入一些Console.WriteLine语句,你应该看到你的期望。