预期行为:
运行后在任务管理器中查看我的互联网使用情况,应该会看到上传大约5秒的峰值,然后回落到正常水平。
结果:
上传速度峰值持续更长的时间(接近一分钟或更长时间,表示上传了完整的文件)
尝试:
- 多次取消(如1秒、10秒等)
- 使用 上传后立即取消令牌
- UploadFromByteArrayAsync()代替UploadFromStreamAsync()使用
- BeginUploadFromStream() with EndUploadFromStream()
虽然我可以很容易地使用CancellationToken取消下载,但无论我做什么,我都无法取消这个上传。而且,奇怪的是,在网上搜索,我找不到任何其他人在取消上传时遇到问题的实例。
_connectionString = "xxx";
if (_connectionString != "")
{
_storageAccount = CloudStorageAccount.Parse(_connectionString);
_blobClient = _storageAccount.CreateCloudBlobClient();
}
string ulContainerName = "speedtest";
string ulBlobName = "uploadTestFile" + DateTime.UtcNow.ToLongTimeString();
CloudBlobContainer container = _blobClient.GetContainerReference(ulContainerName);
CloudBlockBlob ulBlockBlob = container.GetBlockBlobReference(ulBlobName);
CreateDummyDataAsync(_fileUploadSizeMB);
byte[] byteArray = System.IO.File.ReadAllBytes(_filePath + "dummy_upload");
ulBlockBlob.UploadFromStreamAsync(new MemoryStream(byteArray), _ulCancellationTokenSource.Token);
_ulCancellationTokenSource.CancelAfter(5000);
对于在这种情况下最终无法获得cancellationToken工作的任何人…我最终使用的变通方法是
BlobRequestOptions timeoutRequestOptions = new BlobRequestOptions()
{
// Allot 10 seconds for this API call, including retries
MaximumExecutionTime = TimeSpan.FromSeconds(10)
};
然后在方法参数中包含timeoutRequestOptions:
ulBlockBlob.UploadFromStreamAsync(new MemoryStream(byteArray), new AccessCondition(),
timeoutRequestOptions,
new OperationContext(),
new progressHandler(), cancellationToken.Token);
这将强制API调用在一定时间后超时。