我在MVC项目中做了一个很好的控制器助手,当我提出任何ajax请求时,它可以返回结构相似的结果有效负载。看起来像这样:

    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必须返回Task<T>(因此,您可以对其进行await):

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


这将完成当前函数的工作,但是会执行await func()而不是仅仅执行它。

然后,您必须传递Func委托,该委托将Task返回给此方法。当在委托中调用async库时,由于您正在调用的异步方法已经返回了Task,因此将采用以下形式:

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


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

var x = await ResponsifyAsync(_someclass.MyMethodAsync);


我将让您充实该方法,但是这种格式应该可以让您在正确的位置开始。

10-05 20:38
查看更多