Данные графика подкачки - PullRequest
0 голосов
/ 30 сентября 2019

Я проверил несколько потоков подкачки в стеке и не смог создать функциональную копию кода.

Я знаю, что в следующем случае Graph возвращает 200 элементов на страницу, и если я хочу foreach все пункты, которые мне нужны, чтобы перейти на следующую страницу. Пожалуйста, проверьте следующий код и скажите мне, что я делаю неправильно.

Всегда выдает исключение в улове, где вызывается NextPageRequest.GetAsync().

В результате этого кода только 200из 3xx элементов удалены.

var deleteListItems = new List<Microsoft.Graph.ListItem>();
var deleteListItemsPage = await graphServiceClient
    .Sites[siteUrl]
    .Lists[listName]
    .Items
    .Request(deleteQueryOptions)
    .GetAsync();

deleteListItems.AddRange(deleteListItemsPage.CurrentPage);

do
{
    foreach (var deleteItem in deleteListItemsPage)
    {
        awaitTasks.Add(graphServiceClient
            .Sites[siteUrl]
            .Lists[listName]
            .Items[deleteItem.Id]
            .Request()
            .DeleteAsync());
    }

    try
    {
        Task.WaitAll(awaitTasks.ToArray());
    }
    catch
    {
        Console.WriteLine("ERROOR executing the tasks");
    }

    Console.WriteLine("Another PAGE of List Items successfully deleted");

    try
    {
        deleteListItemsPage = await deleteListItemsPage.NextPageRequest.GetAsync();
        deleteListItems.AddRange(deleteListItemsPage.CurrentPage);
    }
    catch
    {
        Console.WriteLine("There is no NextPageRequest for deleting items or ERROR occured.");
    }
} while (deleteListItemsPage.NextPageRequest != null);

1 Ответ

1 голос
/ 30 сентября 2019

Несколько наблюдений:

  1. Модель Task.WaitAll технически правильна, но на практике она подвержена человеческим ошибкам. Вы всегда должны использовать шаблон async / await, если нет веских технических причин, чтобы поступить иначе. Это избавит вас от многих головных болей.

  2. Никогда не используйте пустое предложение catch { }, если только вы не хотите использовать какие-либо исключения без предупреждения или контекста (FTR, вы не этого хотите). По крайней мере, вы должны перехватить универсальный System.Exception и назначить его переменной (catch (Exception e) {}), даже если единственное, что вы делаете с ним, регистрирует исключение на консоли (catch (Exception e) { Console.WriteLine(e); }).

  3. Когда вы знаете, что у объекта есть потенциал null, вы всегда должны проверять null, а не полагаться на Try / Catch. Шаблон Try / Catch опирается на исключения, которые на лот дороже, чем простая проверка на ноль.

Для подобного сценария лучший шаблон будет иметь что-тостроки этого:

private async Task DeleteItems()
{
    // Construct the HTTP Request but DO NOT execute it just yet
    var deleteListItemsRequest = graphServiceClient
        .Sites[siteUrl]
        .Lists[listName]
        .Items
        .Request(deleteQueryOptions);

    // This loop is for iterating over the pages
    do
    {
        // Populate the page by executing the HTTP request
        var deleteListItemsPage = deleteListItemsRequest.GetAsync();

        // Iterate over the current page
        foreach (var listItem in deleteListItemsPage.CurrentPage)
        {
            // Execute the delete and wait for the response
            await graphServiceClient
                .Sites[siteUrl]
                .Lists[listName]
                .Items[deleteItem.Id]
                .Request()
                .DeleteAsync();
        }

        // Check for additional pages
        if (deleteListItemsPage.NextPageRequest != null)
        {
            // If we have an additional page, assign it to the
            // same HTTP Request object. Again, we DO NOT execute 
            // yet. It will get executed at the top of the loop
            deleteListItemsRequest = deleteListItemsPage.NextPageRequest;
        }
        else
        {
            // If we don't have an additional page, set the current
            // request to null so we can use this to trigger an exit
            // from the loop
            deleteListItemsRequest = null;
        }

        // Check if we have a Graph request, if not break out of the loop
    } while (deleteListItemsRequest != null);
}
...