调用异步功能

时间:2015-01-08 20:59:50

标签: c# asynchronous

我在我的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中,我无法理解它。

1 个答案:

答案 0 :(得分:1)

创建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);

我会让你充实这个方法,但是这种格式会让你在正确的方向上走开。