调用异步函数

4

我在我的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中,但还是无法解决问题。


2
你的代码中async在哪里?我没有看到。 - Yuval Itzchakov
你是在说 func 可以指向一个异步函数吗? - vcsjones
OP - 你必须澄清你的意思。你是想要同步和异步版本吗? - Yuval Itzchakov
假设我在_linkHandler上有一个叫做LinkAsync的方法。 我想使用与上面类似的模式,但现在我不能用Responsify静态方法。我已经尝试了像ControllerHelper.Responsify(async () => await _linkHandler.LinKAsync(instruction));但都没有成功。我还尝试过创建一个ResponsifyAsync方法,但不知道该如何处理它。 - Daniel Kempner
我把我的评论移到了答案部分,这样你就能更好地理解我所提出的解决方案 :) - Ant P
1个回答

4
创建一个名为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);

我会让你完善这个方法,但这个格式应该能为你指明正确的方向。

是的 - 这就是为什么你需要使用 ResponsifyResponsifyAsync 的原因。 - Ant P
谢谢,但是在我的函数体里我可以期待什么呢?你不能等待func.DynamicInvoke,那就是我迷失的地方。 - Daniel Kempner
非常感谢你,Ant。它完美地运行了。我之前以为必须使用DynamicInvoke(可能是因为我之前使用的是Delegate而不是Func作为我的参数)。我会更新我的问题并附上最终答案 :) - Daniel Kempner
没问题 - 不过 SO 的惯例是把问题留在问题中,答案留在答案中 ;) - Ant P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接