C# 异步和等待错误。等待后代码未处理
我已经开始在c#中使用async和Wait,我遇到了一个问题,并得到一个错误消息C# 异步和等待错误。等待后代码未处理,c#,asp.net,.net,entity-framework,asynchronous,C#,Asp.net,.net,Entity Framework,Asynchronous,我已经开始在c#中使用async和Wait,我遇到了一个问题,并得到一个错误消息 异步模块或处理程序在异步操作仍挂起时完成。 我使用的是EntityFramework6,我有一个基本服务,每个服务都从中继承,看起来是这样的 public BaseService(TEntity) where TEntity : class { private DataContext _context; public BaseService(DataContext context) {
异步模块或处理程序在异步操作仍挂起时完成。
我使用的是EntityFramework6,我有一个基本服务,每个服务都从中继承,看起来是这样的
public BaseService(TEntity) where TEntity : class {
private DataContext _context;
public BaseService(DataContext context) {
_context = context;
}
public virtual async Task<TEntity> AddAsync(TEntity t)
{
if (_context.Entry<TEntity>(t).State == EntityState.Detached)
{
_context.Set<TEntity>().Add(t);
}
_context.Entry<TEntity>(t).State = EntityState.Added;
await _context.SaveChangesAsync();
return t;
}
}
现在,一旦调用了我的初始值设定项,只有1个权限被添加到数据库中,其他什么都不会发生
我的异步设置正确了吗
我对async/await的理解是,如果我调用这样的方法
protected async override void Seed(DataContext context) {
await AddPermissions(context);
await AddGroups(context);
await AddUsers(context);
await AddPermissionsToGroups(context);
await AddUsersToGroups(context);
// ... more here
}
private async Task AddGroups(DataContext context)
{
var groupService = new GroupService(context);
await groupService.AddAsync(new Group() { Name = "Admin" });
}
private async Task AddPermissions(DataContext context)
{
var permissionService = new PermissionService(context);
await permissionService.AddAsync(new Permission("CanAdd", ""));
await permissionService.AddAsync(new Permission("CanEdit", ""));
await permissionService.AddAsync(new Permission("CanDelete", ""));
await permissionService.AddAsync(new Permission("CanView", ""));
... more there about 10
}
private async Task AddUsers(DataContext context)
{
var userService = new UserService(context);
await userService.AddAsync(new User() { UserName = "name@email.com" });
}
private async Task AddPermissionsToGroups(DataContext context)
{
var groupService = new GroupService(context);
// add all permissions to admin
var adminGroup = context.Groups.Where(e => e.Name == "Admin").FirstOrDefault();
var permissions = context.Permissions.ToList();
foreach (var item in permissions)
{
await groupService.AddPermissionAsync(adminGroup, item);
}
}
private async Task AddUsersToGroups(DataContext context)
{
var userService = new UserService(context);
var user = context.Users.Where(e => e.UserName == "name@mail.com").FirstOrDefault();
var group = context.Groups.Where(e => e.Name == "Admin").FirstOrDefault();
await userService.AddToGroup(user, group);
}
}
await my_async_method
然后将调用此方法,在完成此任务之前,不会处理任何内容。在我调用的方法中,我应该
public async Task my_async_method() {
await MyCallAsync();
}
我需要任务的返回参数吗?它应该是空的吗
如果我错了,欢迎任何指导来纠正我,但我认为EF6只允许每个
DbContext
执行一个异步操作。因此,您必须将代码更改为:
public async Task AddPermissionAsync(Group group, Permission permission)
{
using(var context = new DbContext())
{
// do the add and save stuff
}
}
你说得不太对<代码>等待确保在当前操作完成之前不会执行其他操作。导致操作异步执行的不是
async/await
,而是使代码等待已异步的操作的原因。从何处获得错误以及异常的调用堆栈是什么?此错误通常由async void
方法引起,或者不正确地使用基于事件的异步模式(EAP)组件。尽量减少复制。
public async Task AddPermissionAsync(Group group, Permission permission)
{
using(var context = new DbContext())
{
// do the add and save stuff
}
}