我想测试当许多用户访问服务器在同一时间,所以我尝试这个代码:
[Test]
public void Agregar2RegistrosHorariosDeEntradaDe2EmpleadosAsync()
{
try
{
Parallel.For(0, 2,
async iterador =>
{
try
{
await miClienteLogin.LoginAsync(_nombreUsuario, _password);
}
catch(Exception ex)
{
throw;
}
});
}
catch(Exception ex)
{
Assert.Fail("No se debió producir ninguna excepción.");
}
}
但是我没有得到任何异常,服务器上的日志是这样的:
[13:38:29 DBG] Connection id "0HMPPMB4T" accepted.
[13:38:29 DBG] Connection id "0HMPPMB4T" started.
[13:38:29 DBG] Connection 0HMPPMB4T established using the following protocol: Tls13
[13:38:29 DBG] Connection id "0HMPPMB4T" reset.
[13:38:29 DBG] Connection id "0HMPPMB4T" is closed. The last processed stream ID was 0.
[13:38:29 DBG] The connection queue processing loop for 0HMPPMB4TUI6R completed.
[13:38:29 DBG] Connection id "0HMPPMB4T" sending FIN because: "The client closed the connection."
[13:38:29 DBG] Connection id "0HMPPMB4T" stopped.
但是如果我在并行之外运行相同的代码,它会像预期的那样工作。
我猜这一定是一个问题,当我执行客户端命令内的并行。
我如何在并行for中运行它?或者,当许多用户向服务器请求某些内容时,我如何进行测试?
谢谢。
Parallel.For
不是任务感知的,因此它实际上不会等待LoginAsync
在结束循环之前完成(它只会启动任务,仅此而已)。用Parallel.ForEachAsync
或者只用Task.WhenAll
。如下所示:
[Test]
public async Task Agregar2RegistrosHorariosDeEntradaDe2EmpleadosAsync()
{
try
{
await Task.WhenAll(Enumerable.Range(0, 2)
.Select(_ => miClienteLogin.LoginAsync(_nombreUsuario, _password)));
}
catch (Exception ex)
{
Assert.Fail("No se debió producir ninguna excepción.");
}
}
公立小学如果你想断言是否有东西抛出,你可以使用Assert.Throws
/Assert.ThrowsAsync
。