Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebAPI:';IHttpActionResult';不包含';GetWaiter';_C#_Generics_Asynchronous_Asp.net Web Api_Lambda - Fatal编程技术网

C# WebAPI:';IHttpActionResult';不包含';GetWaiter';

C# WebAPI:';IHttpActionResult';不包含';GetWaiter';,c#,generics,asynchronous,asp.net-web-api,lambda,C#,Generics,Asynchronous,Asp.net Web Api,Lambda,早上好,这是我在社区的第一个问题。我正在使用C#WebAPI框架,并试图将所有控制器的方法都改为异步。我的控制器是从一个GenericController扩展而来的,它有一个从DLL调用方法的方法(CallWF),它还处理所有类型的异常 Layer1/Controllers Layer2/GenericController.CallWF 第3层/DLL方法 这是我的GenericController.CallWF代码: protected IHttpActionResult CallWF<

早上好,这是我在社区的第一个问题。我正在使用C#WebAPI框架,并试图将所有控制器的方法都改为异步。我的控制器是从一个GenericController扩展而来的,它有一个从DLL调用方法的方法(CallWF),它还处理所有类型的异常

Layer1/Controllers Layer2/GenericController.CallWF 第3层/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)) );
    }
}
受保护的IHttpActionResult调用wf(函数操作)
{
尝试
{
返回Ok(action.Invoke());
}
捕获(异常e1)
{
返回(BadRequest(GetMyExceptionMessage(e1));
}
}
受保护的IHttpActionResult调用WF(操作)
{
尝试
{
action.Invoke();
返回Ok();
}
捕获(异常e1)
{
返回(BadRequest(GetMyExceptionMessage(e1));
}
}
这里是控制器方法的示例。

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public IHttpActionResult MyMethodA(int arg1)
{
    return CallWF<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}
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)) );
    }
}
[ResponseType(typeof(string))]
[路线(“MyMethodA”)]
公共IHttpActionResult MyMethodA(int arg1)
{
返回CallWF(
() => {
返回存储a.its方法a(arg1);
});
}
如您所见,该方法是同步的。现在我想把它变成异步的。在阅读了一些解释如何创建异步函数的网站后,我认为这就是解决方案

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
    return await CallWF<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}
[ResponseType(typeof(string))]
[路线(“MyMethodA”)]
公共异步任务MyMethodA(int arg1)
{
返回等待呼叫wf(
() => {
返回存储a.its方法a(arg1);
});
}
但这样做会出现以下错误:

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)) );
    }
}
CS1061“IHttpActionResult”不包含“GetAwaiter”的定义,并且找不到接受“IHttpActionResult”类型的第一个参数的扩展方法“GetAwaiter”(是否缺少using指令或程序集引用?)

尝试另一种方法,我尝试为async创建一个新的CallWF函数。 以下是所采取的方法。

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public IHttpActionResult MyMethodA(int arg1)
{
    return CallWF<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}
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)) );
    }
}
protected async Task callwfancy(Func操作)
{
尝试
{
IHttpActionResult=Ok(action.Invoke());
return wait Ok(action.Invoke());
}
捕获(异常e1)
{
返回(BadRequest(GetMyExceptionMessage(e1));
}
}
这样做,会给我标题错误。

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public IHttpActionResult MyMethodA(int arg1)
{
    return CallWF<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}
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指令或程序集引用?)


有什么办法解决这个问题吗?希望有人能帮助我。

异常消息说明您试图返回一些不可等待的内容。无需等待只需返回任务。除非方法中实际需要异步功能,否则可以使用
Task.FromResult

参考本条:

提示:如果您有一个非常简单的异步方法,您可以 不使用wait关键字(例如,使用 Task.FromResult)。如果你可以不用等待就写下来,那么你应该 在不等待的情况下编写它,并从方法中删除async关键字。 返回Task.FromResult的非异步方法比 返回值的异步方法

使用您的第一次尝试,它可以重构为

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public Task<IHttpActionResult> MyMethodA(int arg1) {
    var result = CallWF<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });

    return Task.FromResult(result);
}
这将允许您通过调用
callwfancy
方法来完成第一个示例中的任务

[ResponseType(typeof(string))]
[Route("MyMethodA")]
public async Task<IHttpActionResult> MyMethodA(int arg1)
{
    return await CallWFAsync<string>(
    () => {
        return repositoryA.itsMethodA(arg1);
    });
}
[ResponseType(typeof(string))]
[路线(“MyMethodA”)]
公共异步任务MyMethodA(int arg1)
{
返回等待callwfancy(
() => {
返回存储a.its方法a(arg1);
});
}

异常消息说明您试图返回一些不可等待的内容。无需等待只需返回任务。除非方法中实际需要异步功能,否则您只需返回
任务
。您可以使用Task.FromResult您所说的一切都有效。首先,我被告知所有存储库的方法都是同步的,所以很明显我不需要创建辅助方法来处理。然后我尝试你的代码,它的工作。谢谢。