异步委托回调未完全执行
Async delegate callbacks not fully executing
我有一个异步方法 MyActionAsync
,它接收一个异步 Func<int, Task>
作为参数作为回调。
该方法正确调用了 asyncCallback,但它在执行完 asynCallback 中的所有 await
之前跳过了该步骤。
这给我带来了一些大问题。
我如何/使用什么来确保只有当 asyncCallback 完全执行时 await asyncCallback(id)
才会跳过。
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
方法 returns 当遇到 await
语句并设置正在等待的异步操作时。 await
完成后,该方法的其余部分将继续。
我不相信您可以像这样逐步完成 async
方法,但如果您输入一些 Console.WriteLine
语句,您应该会看到您期望的结果。
我有一个异步方法 MyActionAsync
,它接收一个异步 Func<int, Task>
作为参数作为回调。
该方法正确调用了 asyncCallback,但它在执行完 asynCallback 中的所有 await
之前跳过了该步骤。
这给我带来了一些大问题。
我如何/使用什么来确保只有当 asyncCallback 完全执行时 await asyncCallback(id)
才会跳过。
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
方法 returns 当遇到 await
语句并设置正在等待的异步操作时。 await
完成后,该方法的其余部分将继续。
我不相信您可以像这样逐步完成 async
方法,但如果您输入一些 Console.WriteLine
语句,您应该会看到您期望的结果。