【发布时间】:2016-12-15 09:59:05
【问题描述】:
早上好,这是我在社区的第一个问题。我正在使用 C# WebAPI 框架,并且正在尝试将所有控制器的方法更改为异步。我的控制器从 GenericController 扩展而来,它有一个方法 (CallWF),可以从 DLL 中调用方法,并且还可以处理各种异常。
Layer1/控制器 Layer2/GenericController.CallWF Layer3/DLL 方法
这是我的 GenericController.CallWF 代码:
protected IHttpActionResult CallWF<T>(Func<T> action)
{
try
{
return Ok(action.Invoke());
}
catch (Exception e1)
{
return( BadRequest( GetMyExceptionMessage(e1)) );
}
}
protected IHttpActionResult CallWF(Action action)
{
try
{
action.Invoke();
return Ok();
}
catch (Exception e1)
{
return( BadRequest( GetMyExceptionMessage(e1)) );
}
}
这是控制器方法的示例。
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public IHttpActionResult MyMethodA(int arg1)
{
return CallWF<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
}
如您所见,该方法是同步的。现在我想把它变成异步的。在阅读了一些解释如何制作异步函数的网站后,我认为这是解决方案。
[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
return await CallWF<string>(
() => {
return repositoryA.itsMethodA(arg1);
});
}
但是这样做,会出现以下错误:
CS1061“IHttpActionResult”不包含“GetAwaiter”的定义,并且找不到接受“IHttpActionResult”类型的第一个参数的扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)
尝试另一种方法,我尝试为异步创建一个新的 CallWF 函数。 这是采用的方法。
protected async Task<IHttpActionResult> CallWFAsync<T>(Func<T> action)
{
try
{
IHttpActionResult res = Ok( action.Invoke());
return await Ok( action.Invoke() );
}
catch (Exception e1)
{
return ( BadRequest(GetMyExceptionMessage(e1)) );
}
}
这样做会导致标题错误。
CS1061“OkNegotiatedContentResult”不包含“GetAwaiter”的定义,并且找不到接受“OkNegotiatedContentResult”类型的第一个参数的扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)
有解决这个问题的想法吗?希望有人可以帮助我。
【问题讨论】:
-
异常消息说明您正在尝试返回无法等待的内容。不需要
await,只需返回Task。除非方法中实际需要异步功能,否则您可以简单地返回Task。你可以使用Task.FromResult
标签: c# generics asynchronous asp.net-web-api lambda