【发布时间】:2020-08-01 05:20:43
【问题描述】:
我试图(几乎)一次向我的 WebAPI 发送多个相同的请求以进行一些性能测试。
为此,我多次致电PerformRequest 并使用await Task.WhenAll 等待他们。
我想计算完成每个请求所需的时间加上每个请求的开始时间。但是,在我的代码中,我不知道如果 R3(请求号 3)的结果出现在 R1 之前会发生什么?时长会出错吗?
从我在结果中看到的,我认为结果是相互混合的。例如,R4 的结果集为 R1 的结果。所以任何帮助将不胜感激。
GlobalStopWatcher 是一个静态类,我用它来查找每个请求的开始时间。
基本上我想确保每个请求的elapsedMilliseconds 和Duration 都与请求本身相关联。
因此,如果第 10 次请求的结果在第 1 次请求的结果之前,则持续时间将为duration = elapsedTime(10th)-(startTime(1st))。不是这样吗?
我想添加一个lock,但似乎不可能在有await 关键字的地方添加它。
public async Task<RequestResult> PerformRequest(RequestPayload requestPayload)
{
var url = "myUrl.com";
var client = new RestClient(url) { Timeout = -1 };
var request = new RestRequest { Method = Method.POST };
request.AddHeaders(requestPayload.Headers);
foreach (var cookie in requestPayload.Cookies)
{
request.AddCookie(cookie.Key, cookie.Value);
}
request.AddJsonBody(requestPayload.BodyRequest);
var st = new Stopwatch();
st.Start();
var elapsedMilliseconds = GlobalStopWatcher.Stopwatch.ElapsedMilliseconds;
var result = await client.ExecuteAsync(request).ConfigureAwait(false);
st.Stop();
var duration = st.ElapsedMilliseconds;
return new RequestResult()
{
Millisecond = elapsedMilliseconds,
Content = result.Content,
Duration = duration
};
}
public async Task RunAllTasks(int numberOfRequests)
{
GlobalStopWatcher.Stopwatch.Start();
var arrTasks = new Task<RequestResult>[numberOfRequests];
for (var i = 0; i < numberOfRequests; i++)
{
arrTasks[i] = _requestService.PerformRequest(requestPayload, false);
}
var results = await Task.WhenAll(arrTasks).ConfigureAwait(false);
RequestsFinished?.Invoke(this, results.ToList());
}
【问题讨论】:
-
是什么让你觉得结果好坏参半?
-
@GabrielLuci 假设我们在
ForLoop中触发了 100 个请求。例如,第一个请求的elapsedMilliseconds将是 1ms 和最后一个请求的 100ms。但是,第 100 个请求的结果在第一个请求的结果之前。那不是返回第 100 个请求(先到)的结果内容和第一个请求(最后一个)的elapsedMilliseconds吗? -
每个请求都有一个单独的本地
Stopwatch,所有请求都有一个全局Stopwatch。您将“持续时间”称为本地Stopwatch获得的测量值,将“毫秒”称为全局Stopwatch获得的测量值。您担心两种测量中的哪一种可能是错误的,是局部的、全局的还是两者兼而有之? -
@TheodorZoulias 他们俩。我想知道该请求在多少毫秒后触发(
elapsedMilliseconds)以及该请求需要多长时间才能完成(duration) -
那你的问题可能太宽泛了。在这里,每个帖子我们只能问一个问题。关于全局
Stopwatch,你可能会觉得这个问题很有趣:Is Stopwatch.ElapsedTicks threadsafe?
标签: c# multithreading asynchronous concurrency async-await