调用异步函数

本文关键字:函数 异步 调用 | 更新日期: 2023-09-27 18:36:53

我在我的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()而不仅仅是执行它。

然后,必须传递一个返回此方法TaskFunc委托。在委托中调用async库时,由于您调用的异步方法已经返回了一个Task,这将简单地采用以下形式:

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

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

var x = await ResponsifyAsync(_someclass.MyMethodAsync);

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