首页 > 解决方案 > 从 c# 将文件上传到 Azure 文件时如何更改最大并发值?

问题描述

我正在尝试将文件(~250Mb 大小)上传到 Azure 文件共享(不是 blob 存储),并且在多次重试尝试后上传失败并抛出异常,指出请求在 6 次重试后失败。我在将文件上传到 azure blob 存储时遇到了完全相同的问题,我发现我需要减少 BlobUploadOptions 上的并发线程数,因为我的网络速度无法处理大量并行线程进行上传。现在要上传到 Azure 文件共享,我找不到可以设置上传最大并发数的属性。关于如何设置它的任何想法?或者任何替代解决方案?PS我正在使用.NET Azure SDK v12

我正在使用的代码:

                string shareName = "test-share";
                string dirName = "sample-dir";
                string fileName = Path.GetFileName(localFilePath);

                ShareClient share = new ShareClient(ConnectionString, shareName);
                await share.CreateAsync();

                ShareDirectoryClient directory = share.GetDirectoryClient(dirName);
                await directory.CreateAsync();

                ShareFileClient fileClient = directory.GetFileClient(fileName);
                using (FileStream stream = File.OpenRead(localFilePath))
                {
                    await fileClient.CreateAsync(stream.Length);
                    await fileClient.UploadRangeAsync(
                        new HttpRange(0, stream.Length),
                        stream);
                }

我在上传到 blob 存储时解决了这个问题,如下所示:

                     BlobUploadOptions uploadOptions = new BlobUploadOptions() {
                     TransferOptions = new Azure.Storage.StorageTransferOptions() {
                         MaximumConcurrency = 2,
                         InitialTransferSize = 100 * 1024 * 1024
                     }
                };

                using (FileStream uploadFileStream = File.OpenRead(filePath))
                {
                    await blobClient.UploadAsync(uploadFileStream, uploadOptions);
                    uploadFileStream.Close();
                }

标签: c#.netwindowsazure

解决方案


浏览 .NET Azure SDK v12 的源码后,.NET Azure SDK v12 没有这样的设置file share

作为一种解决方法,您可以先将文件分块,然后将这些分块文件一个一个上传。在这种情况下,没有并发。示例代码如下:

        //other code            

        ShareFileClient fileClient = directory.GetFileClient(fileName);
        using (FileStream stream = File.OpenRead(localFilePath))
        {
            await fileClient.CreateAsync(stream.Length);

            int blockSize = 1 * 1024 * 1024;
            long offset = 0;//Define http range offset
            BinaryReader reader = new BinaryReader(stream);
            while (true)
            {
                byte[] buffer = reader.ReadBytes(blockSize);
                if (buffer.Length == 0)
                    break;

                MemoryStream uploadChunk = new MemoryStream();
                uploadChunk.Write(buffer, 0, buffer.Length);
                uploadChunk.Position = 0;

                HttpRange httpRange = new HttpRange(offset, buffer.Length);
                var resp = await fileClient.UploadRangeAsync(httpRange, uploadChunk);
                offset += buffer.Length;//Shift the offset by number of bytes already written
            }

            reader.Close();
        }

顺便说一句,有一个Azure Storage Data Movement Library,如果你选择用它来上传文件,你就有机会控制并发。


推荐阅读