将async lambda包装到异步方法

时间:2016-02-08 17:20:07

标签: c# wcf asynchronous async-await

我试图将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。所以我有UserManagerObjectDisposedExceptionDatabase实施,由IUnitOfWork注入。

1 个答案:

答案 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中通常要避免的。