【问题标题】:Async delegate callbacks not fully executing异步委托回调未完全执行
【发布时间】:2015-08-17 05:31:19
【问题描述】:

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

该方法正确地调用了 asyncCallback,但它在 asyncCallback 中的所有 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没有完成?
  • 确实,我在 asyncCallback 内的一行中有一个错误,这就是它没有完全评估它的原因..我的错误

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


【解决方案1】:

代码看起来没问题

它应该等待 asyncCallback 完成

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

也许它似乎没有等到它结束,因为当你按下 F11 时调试器不会进入 Func,只有在你在里面放一个断点它才会进入

您应该检查的另一件事是是否从 Func 内部引发了异常

【讨论】:

  • 我实际上在 asyncCallback 中有一个错误,这就是它没有评估所有等待行的原因
【解决方案2】:

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

我不相信你可以通过 async 这样的方法,但如果你输入一些 Console.WriteLine 语句,你应该会看到你所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多