You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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时将这个选项传入。具体修改如下:

  1. 替换原来报错的行:
m_Blob.ServiceClient.ParallelOperationThreadCount = 10; // 旧代码,已废弃
  1. 改为创建并配置请求选项:
// 创建Blob请求选项并设置并行线程数
var requestOptions = new BlobRequestOptions
{
    ParallelOperationThreadCount = 10,
    // 可以根据需要添加其他配置,比如重试策略等
};
  1. 在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:16:11