使用Async Repository类会引发An Error

时间:2015-01-21 14:27:59

标签: c# asp.net asp.net-mvc-5 entity-framework-6

我的asp.net mvc web应用程序中有以下操作方法: -

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Deactivate(Staff staff)
{
  try
  {
    if (staff == null)
    {
      return Json(new { IsSuccess = "custome", id = 1, description = "Error occurred: Record has already been deleted." }, JsonRequestBehavior.AllowGet);
    }

    staffRepository.DeactivateStaff(staff);
    staffRepository.Save();

    return RedirectToAction("Index");
  }
}

和以下存储库类: -

public void DeactivateStaff(Staff staff)
{
  staff.ISActive = false;
  context.Entry(staff).State = EntityState.Modified;
}

public async void Save()
{
  await context.SaveChangesAsync();
}

以及以下Abstract类: -

public interface IStaffRepository : IDisposable
{
  void Save();
  IQueryable<Staff> GetStaffForGrid(string filter, int page, int pageSize, string sort, string sortdir,bool isdeleted,bool isactive);
  int GetStaffForGridCount(string filter, bool isdeleted, bool isactive);
  SyncWithAD SyncUsersWithAD(string term = null);
  void DeactivateStaff(Staff staff);
  Task<Staff> FindStaff(int id,Byte[] timestamp);
}

现在控制器staffRepository.Save();内的以下方法引发了以下异常: -

  

此时无法启动异步操作。异步   操作只能在异步处理程序中启动或   模块或在页面生命周期中的某些事件期间。如果这   执行页面时发生异常,确保页面为   标记为&lt;%@ Page Async =&#34; true&#34; %GT;

任何人都可以提供建议吗?

修改 我的存储库操作方法是: -

public async Task DeactivateStaff(Staff staff)
              {

                  staff.ISActive = false;
                  context.Entry(staff).State = EntityState.Modified;

              }

            public async Task Save()
            {
                await context.SaveChangesAsync();
            }

我的控制器操作方法是: -

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Deactivate(Staff staff)
        {
try
            {
                if (staff == null)
                { return Json(new { IsSuccess = "custome", id = 1, description = "Error occurred: Record has already been deleted." }, JsonRequestBehavior.AllowGet); }

                staffRepository.DeactivateStaff(staff);
               staffRepository.Save();

                return RedirectToAction("Index");
            }

目前我将在Deactivate方法的VS中获得以下警告: -

  

警告1此异步方法缺少等待&#39;运营商并将运行   同步。考虑使用&#39; await&#39;运营商等待   非阻塞API调用,或等待Task.Run(...)&#39;做CPU限制的工作   在后台线程

当我运行我的应用程序并且我调用action方法时,没有任何异常会引发任何会影响数据库的情况? imean将不会执行更新操作,请您放心吗? 感谢

1 个答案:

答案 0 :(得分:2)

我有一个MSDN article来描述该错误的常见原因 - 其中一个是async void方法。我another MSDN article详细解释了为什么开发人员应该避免使用async void

因此,您只需使用Task代替void。让任务返回方法以Async结尾:

也是一个好主意
public interface IStaffRepository : IDisposable
{
  Task SaveAsync();
  ...
  Task<Staff> FindStaffAsync(int id, byte[] timestamp);
}

实施可以保持不变:

public async Task SaveAsync()
{
  await context.SaveChangesAsync();
}

或者您可以略微简化它:

public Task SaveAsync()
{
  return context.SaveChangesAsync();
}

,您的控制器方法变为async

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Deactivate(Staff staff)
{
  try
  {
    ...

    staffRepository.DeactivateStaff(staff);
    await staffRepository.SaveAsync();

    return RedirectToAction("Index");
  }
  ...
}