调用异步函数

Invoke Async Funcs

我在我的 MVC 项目中做了一个很好的控制器助手,它允许我在发出任何 ajax 请求时 return 类似结构的结果有效负载。它看起来像这样:

    public static JsonNetResult Responsify<T>(Func<T> func)
    {
        AjaxResponse response;
        var result = new JsonNetResult
        {
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

        try
        {
            var resp = func();
            response = AjaxResponse.SuccessResponse(resp);
            result.Data = response;
        }
        catch (Exception e)
        {
            response = AjaxResponse.ErrorResponse(e.Message);
            result.Data = response;
        }

        return result;
    }

它被这样使用:

    [HttpPost]
    public JsonNetResult Link(LinkInstruction instruction)
    {
        return ControllerHelper.Responsify(() => _linkHandler.Link(instruction));
    }

其中 _linkHandler.Link 不是异步的。

我的问题是我想使用此模式调用一些异步处理程序,但我不知道如何等待该函数。我试过 Task.Factory.StartNew 以及将 lambda 包装在 async/await 中,但我不太明白。

创建 Responsify 的一个版本 - 称之为 ResponsifyAsync - 指定传递的 Func 必须 return 一个 Task<T> (因此意味着你可以await它):

public async static JsonNetResult ResponsifyAsync<T>(Func<Task<T>> func)
{
    ...
}

这将完成您当前函数所做的大部分工作,但 await func() 而不是仅仅执行它。

然后您必须将 Func 委托传递给此方法,该委托 return 是 Task。在委托中调用 async 库时,由于您调用的异步方法已经 return 是 Task,这将简单地采用以下形式:

var x = await ResponsifyAsync(() => _someClass.MyMethodAsync(someParameter));

或者,如果该方法是无参数的...

var x = await ResponsifyAsync(_someclass.MyMethodAsync);

我会让你充实这个方法,但这种格式应该会让你走上正轨。