我试图将sampleApp.filter('noCarriageReturn', function() {
return function(value) {
return (!value) ? '' : value.replace(/(\r\n|\n|\r)/gm, "");
};
});
包裹到try-catch块中。问题是我的EF上下文在同一时间范围内被破坏了。我想问题编译器不知道该怎么做。我的catch块也没有处理任何异常。对不起我的英文,我希望我的代码显示我的意思:
Operations Contracts
private static async Task<T> SurroundWithTryCatch<T>(Action t, T response) where T : BaseResponse
{
try
{
await Task.Run(t);
}
catch (Exception e)
{
response.Success = false;
response.Errors.Add(e.Message);
}
return response;
}
public async Task<CreateResponse> CreateAsync(CreateRequest request)
{
var response = new CreateResponse();
return await SurroundWithTryCatch(async delegate
{
var newUser = new ApplicationUser { UserName = request.UserName, Email = request.Email };
await Database.UserManager.CreateAsync(newUser, request.Password);
//Some another logic...
await Database.CommitAsync();
}, response);
}
方法第二行中的问题。早些时候GC已清除CreateAsync
。所以我有UserManager
。 ObjectDisposedException
是Database
实施,由IUnitOfWork
注入。
答案 0 :(得分:3)
您正在打破await
链 - t
不再返回任务。由于您不再有任务,执行将在第一个await
之后继续,而不是在整个方法完成之后。将await
视为return
- 如果您没有返回(和await
/等待)任务,则会失去同步的机会。
相反,您希望传递Func<Task>
,并直接等待它:
private static async Task<T> SurroundWithTryCatch<T>(Func<Task> t, T response) where T : BaseResponse
{
try
{
await t();
}
catch (Exception e)
{
response.Success = false;
response.Errors.Add(e.Message);
}
return response;
}
public async Task<CreateResponse> CreateAsync(CreateRequest request)
{
var response = new CreateResponse();
return await SurroundWithTryCatch(async () =>
{
var newUser = new ApplicationUser { UserName = request.UserName, Email = request.Email };
await Database.UserManager.CreateAsync(newUser, request.Password);
//Some another logic...
await Database.CommitAsync();
}, response);
}
Task.Run
也可以,但你可能不希望这样 - 你的代码是异步的,并且(猜测)你在ASP.NET请求中运行,所以启动任务没有任何好处只是等待另一个任务的结果。 Task.Run
用于在单独的线程中执行CPU工作,这是ASP.NET中通常要避免的。