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请注意,在您链接到的示例中,tasksGetBitmapAsync
上没有等待。
_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();
}
}