我在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);
我将让您充实该方法,但是这种格式应该可以让您在正确的位置开始。