Можно ли возвращаться несколько раз из функции asyn c? - PullRequest
3 голосов
/ 30 мая 2020

В настоящее время я работаю над написанием моей собственной неорганизованной P2P-сети (просто для развлечения) и пытаюсь изучить asyn c. Я хочу вызвать следующую функцию, которая вернет фрагмент byte [] отправляемого файла. Затем основная функция делегирует передачу этого фрагмента. Возможно ли, чтобы функция возвращала данные несколько раз, ожидая передачи предыдущего фрагмента в fini sh, прежде чем читать следующий фрагмент в память? Я знаю, что могу написать функцию, которая будет просто вызываться несколько раз с аргументами отслеживания индекса, но я хотел бы использовать asyn c, если возможно, поскольку это кажется идеальным вариантом использования.

public async Task<byte[]> ChunkData(string str)
    {
        byte[] tempData = new byte[BUFFER_SIZE]; //Stores one chunk of data
        byte[] dataBytes = Encoding.Default.GetBytes(str); //Stores all data TODO: convert to filestream
        int extraBytes = 0; //Track any extra bytes after we have exhausted full chunks
        int dataChunks = dataBytes.Length / BUFFER_SIZE; //Determine how many chunks are in the file
        for (int i = 0; i <= dataChunks; i++) //Loop for all dataChunks and once more for extraBytes
        {
            if (i == dataChunks) //Last iteration
            {
                extraBytes = dataBytes.Length - dataChunks * BUFFER_SIZE;
                if (extraBytes == 0) break; //Break if no extra bytes
            }
            int endPoint = dataChunks > 0 ? (BUFFER_SIZE * (i != dataChunks ? (i + 1) : i)) : 0;
            int frontPoint = i == 0 ? 0 : (BUFFER_SIZE * i);

            tempData = dataBytes[frontPoint..(endPoint + extraBytes)]; //Assign tempData to range

            Console.WriteLine(Encoding.Default.GetString(tempData)); //For debugging
        }
    }
...