使用HttpResponseMessage异步执行长操作

时间:2017-08-12 12:54:06

标签: c# asynchronous iis asp.net-web-api async-await

我正在计算我的C#web api的性能。我写了一个非常简单的HelloWorld回复:

public class HelloWorldController : ApiController
{
    public HttpResponseMessage Get()
    {

        return new HttpResponseMessage()
        {
            Content = new StringContent("HelloWorld")
        };
    }
}

我使用JMeter进行测试我设置了1000个用户请求并且它工作正常(CPU使用率高达100%)。但问题是当api的操作时间变长时,响应变得更糟,每个响应只有3个(CPU使用率<7%)。这需要1000个用户请求minuets。

public HttpResponseMessage Get()
    {
        Thread.Sleep(1000);
        return new HttpResponseMessage()
        {
            Content = new StringContent("HelloWorld")
        };
    }

谷歌之后我想出了使用异步的想法,但我仍然遇到同样的问题。我不知道问题是什么或我的代码实现。以下是我的示例实现。

public async Task<HttpResponseMessage> Get()
    {
        return new HttpResponseMessage()
        {
            Content = new StringContent(await LongOperationAsync())
        };
    }
    private string LongOperation()
    {
        //long operation here
        Thread.Sleep(1000);
        return "HelloWorld";
    }

    private Task<string> LongOperationAsync()
    {
        return Task.Factory.StartNew(() => LongOperation());
    }

任何人都知道这个问题是什么问题或任何想法?

1 个答案:

答案 0 :(得分:3)

方法LongOperationAsync和LongOperation也应该 async

private async Task<string> LongOperation()
{
    //long operation here
    await Task.Delay(1000);
    return "HelloWorld";
}
private async Task<string> LongOperationAsync()
{
    var rt =  await Task.Run(() => LongOperation());
    return rt;
}

请参阅: Asynchronous programming