我在我的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中,我无法理解它。
答案 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);
我会让你充实这个方法,但是这种格式会让你在正确的方向上走开。