c# – 将异步上传到Azure Blob存储永远不会返回
我正在尝试使用异步方法将文件上载到Azure blob存储,然后设置其元数据,但UploadFromByteArrayAsync方法永远不会返回.
我有以下代码: var connAzureBlob = ConfigurationManager.AppSettings["AzureBlobStorage"]; var storageAccount = CloudStorageAccount.Parse(connAzureBlob); var blobClient = storageAccount.CreateCloudBlobClient(); var fileContainer = blobClient.GetContainerReference(ConfigurationManager.AppSettings["AzureBlobContainer"]); if (!fileContainer.Exists()) { await fileContainer.CreateAsync(); await fileContainer.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); } try { var fileBlob = fileContainer.GetBlockBlobReference(documentId.ToString()); await fileBlob.UploadFromByteArrayAsync(buffer,buffer.Length); Log.Info($"{nameof(SaveToBlobAsync)}: blob {documentId} uploaded."); await fileBlob.FetchAttributesAsync(); fileBlob.Properties.ContentType = contentType; fileBlob.Metadata["..."] = "..."; await fileBlob.SetMetadataAsync(); Log.Info($"{nameof(SaveToBlobAsync)}: {documentId} - metadata saved."); } catch (Exception exception) { Log.Error($"{nameof(SaveToBlobAsync)}: An exception was thrown while saving a file to a blob: ",exception); throw; } 使用上面的代码,我希望看到以下消息记录:
但这些从未出现过. 但是,blob确实存储(我可以使用Azure Storage Explorer查看其内容),但该过程似乎没有移动到下一行(这将是第一个日志消息). 如果我为非异步对应方切换所有异步调用,则代码按预期工作. 任何人都可以解释为什么UploadFromByteArrayAsync似乎没有返回? 更新: 此代码是从Web API方法调用的.有问题的控制器没有异步代码,除了调用存储库方法之外别无其他.存储库方法在调用与blob存储接口的类之前更新SQL DB – 再次,所有这些都是非异步代码. 这个面向blob存储的类具有非异步方法,除了使用.Wait()或.Result调用它们的异步等效项之外别无其他. 在有问题的情况下,第二阶段的存储库调用非异步版本,因此上面的代码基本上是用.Wait()调用的. 在上面的代码之前,此HTTP请求中没有其他异步调用,从它进入Web API的控制器. 解决方法
错误几乎肯定会进一步上升到您的调用堆栈,其中某些方法阻止返回的任务(例如,任务< T> .Result,Task.Wait等).如果要完成任务需要阻塞线程,则会发生死锁.
I explain this situation in full on my blog,但它的要点是这样的: 默认情况下,await将捕获“上下文”并使用它来恢复异步方法. 因此,当调用代码阻塞返回的Task时,它在该上下文中保持一个线程,阻止Task完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |