Я не могу понять, как правильно заполнить список <string>внутри задачи c# - PullRequest
0 голосов
/ 10 июля 2020

Я написал этот абсурдный код для большей ясности:

  • Имеет ли значение, если я использую CallingFunctionAsync_v1 по сравнению с CallingFunctionAsync_v2?

Если да , может кто-нибудь объяснить почему?

Определения:

class WorkHorse
{
    const int RECORD_SIZE = 12;

    public async Task<List<string>> DoTheThingAsync_v1(CancellationToken cancellationToken)
    {

        List<string> theList = new List<string>();

        byte[] buffer = new byte[RECORD_SIZE];

        using var fs = File.OpenRead("awesome_stuff.bin");
        int read;
        while ((read = await fs.ReadAsync(buffer, 0, RECORD_SIZE, cancellationToken).ConfigureAwait(false)) != 0)
        {
            theList.Add(Encoding.UTF8.GetString(buffer, 0, RECORD_SIZE));
        }

        return theList;
    }

    public async Task DoTheThingAsync_v2(List<string> theList, CancellationToken cancellationToken)
    {
        byte[] buffer = new byte[RECORD_SIZE];

        using var fs = File.OpenRead("awesome_stuff.bin");
        int read;
        while ((read = await fs.ReadAsync(buffer, 0, RECORD_SIZE, cancellationToken).ConfigureAwait(false)) != 0)
        {
            theList.Add(Encoding.UTF8.GetString(buffer, 0, RECORD_SIZE));
        }
    }
}

Использование:

class FunTimes
{
    List<string> TheStrings;

    public async Task CallingFunctionAsync_v1(CancellationToken cancellationToken)
    {
        this.TheStrings = await new WorkHorse().DoTheThingAsync_v1(cancellationToken).ConfigureAwait(false);
    }

    public Task CallingFunctionAsync_v2(CancellationToken cancellationToken)
    {
        this.TheStrings = new List<string>();
        return new WorkHorse().DoTheThingAsync_v2(this.TheStrings, cancellationToken);
    }

}

1 Ответ

3 голосов
/ 10 июля 2020

V1 - лучший подход. Это чистая функция черного ящика, которая всегда возвращает новый список.

V2 ожидает инициализированный экземпляр List<string>, который подвержен ошибкам. Вы можете легко передать null и получить проблему. Затем, поскольку это асинхронные c методы, вы можете запускать V2 одновременно, и у вас будут условия гонки по списку, который вы передали.

...