C# 请求不是异步的

C# 请求不是异步的,c#,asynchronous,async-await,C#,Asynchronous,Async Await,(如果你提供了答案,回答起来会更容易) 将Thread.Sleep与异步代码混合使用不是一个好主意,因为这是一个阻塞调用 还应避免模拟内部构件 下面是一个简单的测试示例,执行10个请求大约需要1秒: _messageHandlerMock .Protected() .Setup<Task<HttpResponseMessage>>(MethodToMoq, ItExpr.IsAny<Ht

(如果你提供了答案,回答起来会更容易)

Thread.Sleep
与异步代码混合使用不是一个好主意,因为这是一个阻塞调用

还应避免模拟内部构件

下面是一个简单的测试示例,执行10个请求大约需要1秒:

        _messageHandlerMock
                .Protected()
                .Setup<Task<HttpResponseMessage>>(MethodToMoq, ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
                .Callback(() => Thread.Sleep(1000))
                .ReturnsAsync(callback)
                .Verifiable();
异步任务测试()
{
var httpClient=newhttpclient(newtesthttpmessagehandler());
var ticks=Environment.TickCount;
wait Task.WhenAll(Enumerable.Range(0,10)。选择(=>httpClient.GetAsync(“https://stackoverflow.com/")));
WriteLine($“{Environment.TickCount-ticks}ms”);
}
类TestHttpMessageHandler:HttpMessageHandler
{
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
等待任务。延迟(1000);
返回新的HttpResponseMessage();
}
}

我使用实际URL测试了您的类
RollingRequests
,并按预期工作。然后我将
await\u client.GetAsync(…
替换为
await Task.Delay(1000)
并按预期继续工作。然后将同一行替换为
Thread.Sleep(1000)
并复制了您的问题


道德教训:在运行异步代码时避免阻塞当前线程!

在任何时候使用
时,您通常不会等待启动的任务。您会从“any”中提取结果完成了。你能更具体地说明我在哪里有错误的
wait
吗?你正在等待
RequestUrlAsync
中的任务。我从未尝试过这样做,看看当你执行
WaitAny
WaitAll
时会发生什么,但这可能就是为什么你看到证据表明它不是异步的——尽管它仍然是异步的。我建议在这种方法中,你不等待,而是从
WhenAny
获取任务的结果。但是,你有更多的问题。你在循环中调用WhenAny,但这只返回第一个完成的任务。然后你等待一个已经完成的任务。这段代码应该做什么?你听说过Polly框架吗?It simp请注意,在您链接到的示例中,tasks
GetBitmapAsync
上没有等待。
        _messageHandlerMock
                .Protected()
                .Setup<Task<HttpResponseMessage>>(MethodToMoq, ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
                .Callback(() => Thread.Sleep(1000))
                .ReturnsAsync(callback)
                .Verifiable();
async Task Test()
{
    var httpClient = new HttpClient(new TestHttpMessageHandler());

    var ticks = Environment.TickCount;

    await Task.WhenAll(Enumerable.Range(0, 10).Select(_ => httpClient.GetAsync("https://stackoverflow.com/")));

    Console.WriteLine($"{Environment.TickCount - ticks}ms");
}

class TestHttpMessageHandler : HttpMessageHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        await Task.Delay(1000);

        return new HttpResponseMessage();
    }
}