我的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将不会执行更新操作,请您放心吗? 感谢
答案 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");
}
...
}