处理异步块中的异常的方法无法将返回对象转换为异步方法返回类型

时间:2015-05-19 19:15:09

标签: c# async-await

我已经实现了一个处理异步块异常的方法,如下所示:

public async Task<ServiceResponse<T>> RetryTest<T>(Func<Task<ServiceResponse<T>>> method)
    {
        try
        {
            return await method.Invoke();
        }
        catch (Exception exception)
        {
            return FormatExceptionResponse<T>(exception);
        }
    }

并使用它来包装异步代码,如:

public async Task<ServiceResponse<DataJob>> Insert(DataJob entity)
    {

        return await RetryTest<ServiceResponse<DataJob>>(async () =>
        {
            Context.AddObject("DataJobs", entity);
            DataServiceResponse responses = await Context.SaveChangesAsync();

            return new ServiceResponse<DataJob>((HttpStatusCode)responses.Last().StatusCode, entity);

        });

    }

但是最后一个return语句有一个错误:无法将表达式类型ServiceResponse转换为异步方法返回类型ServiceResponse。

有任何线索如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您对RetryTest的定义接受T,然后返回ServiceResponse<T>

当你调用它时,你提供了ServiceResponse<DataJob>作为T,因此返回类型为RetryTest,因为它需要将T包裹在ServiceResponse中},应该返回ServiceResponse<ServiceResponse<DataJob>>而不是ServiceResponse<DataJob>。 (你没有回复,因此错误。)

您只想将DataJob作为通用参数传递给RetryTest而不是ServiceResponse<DataJob>

或者,更好的是,只需在调用RetryTest时完全删除泛型参数并让它们正确推断,然后就不会搞砸了。