调用异步函数
Invoke Async Funcs
我在我的 MVC 项目中做了一个很好的控制器助手,它允许我在发出任何 ajax 请求时 return 类似结构的结果有效负载。它看起来像这样:
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
必须 return 一个 Task<T>
(因此意味着你可以await
它):
public async static JsonNetResult ResponsifyAsync<T>(Func<Task<T>> func)
{
...
}
这将完成您当前函数所做的大部分工作,但 await func()
而不是仅仅执行它。
然后您必须将 Func
委托传递给此方法,该委托 return 是 Task
。在委托中调用 async
库时,由于您调用的异步方法已经 return 是 Task
,这将简单地采用以下形式:
var x = await ResponsifyAsync(() => _someClass.MyMethodAsync(someParameter));
或者,如果该方法是无参数的...
var x = await ResponsifyAsync(_someclass.MyMethodAsync);
我会让你充实这个方法,但这种格式应该会让你走上正轨。
我在我的 MVC 项目中做了一个很好的控制器助手,它允许我在发出任何 ajax 请求时 return 类似结构的结果有效负载。它看起来像这样:
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
必须 return 一个 Task<T>
(因此意味着你可以await
它):
public async static JsonNetResult ResponsifyAsync<T>(Func<Task<T>> func)
{
...
}
这将完成您当前函数所做的大部分工作,但 await func()
而不是仅仅执行它。
然后您必须将 Func
委托传递给此方法,该委托 return 是 Task
。在委托中调用 async
库时,由于您调用的异步方法已经 return 是 Task
,这将简单地采用以下形式:
var x = await ResponsifyAsync(() => _someClass.MyMethodAsync(someParameter));
或者,如果该方法是无参数的...
var x = await ResponsifyAsync(_someclass.MyMethodAsync);
我会让你充实这个方法,但这种格式应该会让你走上正轨。