升级Azure.Storage至9.3.3后C#多线程Blob上传报错求助
解决WindowsAzure.Storage 9.3.3中并行上传线程设置的问题
你遇到的问题是因为Azure Storage SDK从2.x升级到9.x后,并行操作线程数的配置方式发生了根本性变化——原来ServiceClient上的ParallelOperationThreadCount属性已经被移除,取而代之的是通过请求选项来配置。
问题根源
在旧版本(2.x)的SDK中,并行线程数是直接在服务客户端实例上设置的,但在9.x版本中,这类请求级别的配置被统一移到了BlobRequestOptions(或对应服务的RequestOptions类)中,这样可以更灵活地为单个请求或全局请求配置不同的参数。
修正代码的步骤
你需要修改代码,创建BlobRequestOptions实例并设置ParallelOperationThreadCount,然后在调用BeginUploadFromStream时将这个选项传入。具体修改如下:
- 替换原来报错的行:
m_Blob.ServiceClient.ParallelOperationThreadCount = 10; // 旧代码,已废弃
- 改为创建并配置请求选项:
// 创建Blob请求选项并设置并行线程数 var requestOptions = new BlobRequestOptions { ParallelOperationThreadCount = 10, // 可以根据需要添加其他配置,比如重试策略等 };
- 在调用
BeginUploadFromStream时传入这个选项:
asyncresult = m_Blob.BeginUploadFromStream(pstream, requestOptions, BlobTransferCompletedCallback, new BlobTransferAsyncState(m_Blob, pstream));
可选:全局配置并行线程数
如果你希望所有的Blob请求都默认使用这个并行线程数,可以直接在CloudBlobClient的DefaultRequestOptions中设置,这样就不需要为每个请求单独创建BlobRequestOptions了:
// 假设你有CloudBlobClient实例client client.DefaultRequestOptions.ParallelOperationThreadCount = 10;
完整修改后的UploadBlobAsync方法片段
public void UploadBlobAsync(ICloudBlob blob, string LocalFile) { lock (WorkingLock) { if (!Working) Working = true; else throw new Exception("BlobTransfer already initiated. Create new BlobTransfer object to initiate a new file transfer."); } using (FileStream fstemp = new FileStream(LocalFile, FileMode.Open, FileAccess.Read)) { } asyncOp = AsyncOperationManager.CreateOperation(blob); TransferType = TransferTypeEnum.Upload; m_Blob = blob; m_FileName = LocalFile; var file = new FileInfo(m_FileName); long fileSize = file.Length; FileStream fs = new FileStream(m_FileName, FileMode.Open, FileAccess.Read, FileShare.Read); ProgressStream pstream = new ProgressStream(fs); pstream.ProgressChanged += pstream_ProgressChanged; pstream.SetLength(fileSize); // 新增:配置并行操作线程数 var requestOptions = new BlobRequestOptions { ParallelOperationThreadCount = 10 }; m_Blob.StreamWriteSizeInBytes = GetBlockSize(fileSize); // 传入requestOptions到BeginUploadFromStream asyncresult = m_Blob.BeginUploadFromStream(pstream, requestOptions, BlobTransferCompletedCallback, new BlobTransferAsyncState(m_Blob, pstream)); }
这样修改后,就能正确设置多线程并行上传了,符合9.3.3版本SDK的API规范。
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

