Измерение длительности нескольких задач в C# с неверным указанием времени - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь приблизительно измерить время, необходимое для завершения sh набора асинхронных задач. Мой подход

var stopwatch = Stopwatch.StartNew();
await Task.WhenAll(tasks);
stopwatch.Stop();

Я сижу и жду, пока операция завершится sh более 5 минут, но секундомер скажет, что прошло 1,5 секунды.

Я также попробовал:

var stopwatch = Stopwatch.StartNew();
await Task.WhenAll(tasks).ContinueWith(task => stopwatch.Stop());

... но все равно сообщается, что прошло всего 1,5 секунды, но для запуска все еще требуется более 5 минут.

tasks - переменная типа IEnumerable<Task<T>>.

Я изо всех сил пытаюсь найти способ диагностировать это и надеялся, что смогу помочь. Спасибо!

Обновление

Вот более полный пример:

public async Task<BulkOperationResponse<Source>> BulkInsertSourceDocumentsAsync(IEnumerable<Source> documents)
{
    _logger.LogInformation("Beginning bulk insert...");

    var tasks = new List<Task<OperationResponse<Source>>>(documents.Count());
    tasks.AddRange(documents.Select(document =>
        _orderStatusesContainer.CreateItemAsync(document, new PartitionKey(document.CUSTACCOUNT))
            .CaptureOperationResponse(document)));

    var response = await ExecuteTasksAsync(tasks);

    return response;
}
public async Task<BulkOperationResponse<T>> ExecuteTasksAsync<T>(
    IReadOnlyCollection<Task<OperationResponse<T>>> tasks)
{
    _logger.LogInformation($"Executing {tasks.Count} tasks");

    // TODO: This seems to be reporting the wrong time
    // Opened an issue on GitHub: https://github.com/MicrosoftDocs/azure-docs/issues/53193
    var stopwatch = Stopwatch.StartNew();
    await Task.WhenAll(tasks);
    stopwatch.Stop();

    _logger.LogInformation($"Finished {tasks.Count} tasks in {stopwatch.Elapsed}");

    return new BulkOperationResponse<T>
    {
        TotalTimeTaken = stopwatch.Elapsed, // TODO: Confirm time is correct.
        TotalRequestUnitsConsumed = tasks.Sum(task => task.Result.RequestUnitsConsumed),
        SuccessfulDocuments = tasks.Count(task => task.Result.IsSuccessful),
        Failures = tasks.Where(task => !task.Result.IsSuccessful)
            .Select(task => (task.Result.Item, task.Result.CosmosException)).ToList()
    };
}

В моем тесте я импортирую 400 000 документов, и все они успешно завершены через 5 минут.

...