异步委托回调没有完全执行

本文关键字:执行 回调 异步 | 更新日期: 2023-09-27 17:53:01

我有一个异步方法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);
}

异步委托回调没有完全执行

代码似乎没有问题

它应该等待asyncCallback完成

你怎么知道它不会等到它结束?

也许它看起来没有等到结束,因为当你按下F11时,调试器不会进入Func,只有当你在

中放置一个断点时,它才会进入。你应该检查的另一件事是如果从Func
内部抛出异常

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

我不相信您可以像这样逐步执行async方法,但是如果您放入一些Console.WriteLine语句,您应该可以看到您所期望的