调用异步函数
本文关键字:函数 异步 调用 | 更新日期: 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()
而不仅仅是执行它。
然后,必须传递一个返回此方法Task
的Func
委托。在委托中调用async
库时,由于您调用的异步方法已经返回了一个Task
,这将简单地采用以下形式:
var x = await ResponsifyAsync(() => _someClass.MyMethodAsync(someParameter));
或者,如果该方法是无参数的...
var x = await ResponsifyAsync(_someclass.MyMethodAsync);
我会让你充实方法,但这种格式应该让你走上正确的方向。