Как создать поток во время его загрузки в dotnet - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь взять файл и разделить его на части, а затем добавить sh каждый новый файл меньшего размера в azure. Я попытался записать MemoryStream в azure, но это приводит к немедленной загрузке файла, но файл в основном пуст. Я попытался использовать BufferedStream, который позволяет отправлять данные во время записи в него, но я не уверен, как завершить поток. Я попытался закрыть каждый из различных потоков, которые я использую, но это не работает, поскольку это приводит к исключению закрытого потока. Любая идея, как пометить поток как завершенный, чтобы библиотека azure знала, чтобы завершить sh загрузку файла?

Это действительно работает, чтобы дождаться полной сборки файла, а затем загрузить поток памяти, но я хотел бы иметь возможность писать на него во время загрузки, если это возможно.

CloudBlobClient blobClient = StorageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference("containerName");

using (FileStream fileStream = File.Open(path)
{
    int key = 0;
    CsvWriter csvWriter = null;
    MemoryStream memoryStream = null;
    BufferedStream bufferedStream = null;
    StreamWriter streamWriter = null;
    Task<StorageUri> uploadTask = null;

    using (var reader = new StreamReader(fileStream))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Read();
        csv.ReadHeader();

        await foreach (model row in csv.GetRecordsAsync<MyModel>())
        {
            if (row.KeyColumn != key)
            {
                if (memoryStream != null)
                {
                    //Wiat for the current upload to finish
                    await csvWriter.FlushAsync();
                    csvWriter.Dispose();
                    await uploadTask;
                }

                //Start New Upload
                key = row.KeyColumn;

                memoryStream = new MemoryStream();
                bufferedStream = new BufferedStream(memoryStream)
                streamWriter = new StreamWriter(bufferedStream);
                csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
                csvWriter.WriteHeader<MyModel>();
                await csvWriter.FlushAsync();

                CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference($"file_{key}.csv");
                uploadTask = blockBlob.UploadFromStreamAsync(bufferedStream);
            }

            csvWriter.WriteRecord(row);
            await csvWriter.FlushAsync();
        }

        if (memoryStream != null)
        {
            await csvWriter.FlushAsync();
            csvWriter.Dispose();
            await uploadTask;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...