C# 如何在返回类型为Task的方法中尝试捕获?

C# 如何在返回类型为Task的方法中尝试捕获?,c#,task-parallel-library,C#,Task Parallel Library,我有以下方法(为了简单起见缩写): 我想合并一个try-catch块,这样我就可以记录任何潜在的Sql错误 public Task CreateAsync(TUser user) { var result = ???; // what is the return type here? try { result = FromResult(connection.Execute("CreateUser", param, commandType: Comm

我有以下方法(为了简单起见缩写):

我想合并一个
try-catch块
,这样我就可以记录任何潜在的Sql错误

public Task CreateAsync(TUser user)
{
     var result = ???; // what is the return type here?
     try
     {
         result = FromResult(connection.Execute("CreateUser", param, commandType: CommandType.StoredProcedure));
      }
      catch(SqlException sqlEx)
      {
          // log error here
       }

      return result;
}

我想我不确定
Task
的返回类型是什么?

您应该使用异步方法,而不是
Task.FromResult
。 我假设您使用的是Dapper或某种扩展了
SqlConnection
的框架。 我不知道存储过程返回什么。如果返回值无关紧要,那么代码应该如下所示

public async Task CreateAsync(TUser user)
{
     try
     {
         await connection.ExecuteAsync("CreateUser", param, commandType: CommandType.StoredProcedure);
     }
     catch(SqlException sqlEx)
     {
         // log error here
     }
}
如果有关系(例如bool):

公共异步任务CreateAsync(TUser用户)
{
布尔结果;
尝试
{
wait connection.ExecuteAsync(“CreateUser”,参数,commandType:commandType.StoredProcedure);
结果=真;
}
捕获(SqlException sqlEx)
{
//此处记录错误
结果=假;
}
返回结果;
}

返回类型为Task,T由connection.Execute(…)的返回类型决定。请考虑这项任务。FromResult(…)仍然是同步的。如果您希望它是异步的,您可以使用Task.Run(…)或连接对象的异步方法。我看不出返回
Task
的目的是什么,您的方法实现一点也不异步,可以详细说明一下吗?对该方法的调用是:
var result=await UserManager.CreateAsync(user,model.Password)
@LasseVågsætherKarlsen根据签名,OP正在实现一个自定义用户存储,实现ASP.NET Identity的
IUserStore
是的,我正在使用dapper@PixelPaul然后,您可以考虑使用QueRasyNC方法来代替ExcUnTeaSyc。好处是,您可以从存储的进程中返回内容。
public async Task CreateAsync(TUser user)
{
     try
     {
         await connection.ExecuteAsync("CreateUser", param, commandType: CommandType.StoredProcedure);
     }
     catch(SqlException sqlEx)
     {
         // log error here
     }
}
public async Task<bool> CreateAsync(TUser user)
{
     bool result;
     try
     {
        await connection.ExecuteAsync("CreateUser", param, commandType: CommandType.StoredProcedure);
        result = true;
     }
     catch(SqlException sqlEx)
     {
         // log error here
        result = false;
     }

     return result;
}