将异步上传到Azure Blob存储永远不会返回

w

我正在尝试使用异步方法将文件上传到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, 0, 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;
}

使用上面的代码,我希望看到记录以下消息:

SaveToBlobAsync:Blob 123已上传。
SaveToBlobAsync:123-保存的元数据。

但是这些永远不会出现。

但是,blob确实已存储(我可以使用Azure Storage Explorer查看其内容),但是该过程似乎没有移至下一行(这将是第一条日志记录消息)。

如果我将所有异步调用都切换为它们的非异步对应项,则代码将按预期工作。

谁能解释为什么UploadFromByteArrayAsync似乎没有回来?

更新:我想我会添加一些有关上下文的更多信息,以防它有所帮助。

此代码是从Web API方法中调用的。有问题的控制器没有异步代码,除了调用存储库方法外,无所作为。在调用与Blob存储接口的类之前,存储库方法会更新SQL DB-同样,所有这些都是非异步代码。

这个面向Blob存储的类具有非异步方法,除了使用.Wait()调用它们的异步等效项外,其他操作无济于事.Result

在有问题的情况下,第二阶段的存储库正在调用非异步版本,因此上述代码本质上是通过调用的.Wait()

在上述代码之前,此HTTP请求中从进入Web API控制器的位置开始,没有其他异步调用。

斯蒂芬·克莱里

该错误是几乎可以肯定进一步您的通话栈,其中一些方法在返回的任务阻塞(如Task<T>.ResultTask.Wait等)。如果完成任务需要阻塞的线程,则会死锁。

我在博客上完整地解释了这种情况,但是要点是:

  • await默认情况下将捕获一个“上下文”,并使用它来恢复该async方法。
  • 如果此代码是在ASP.NET请求上下文中执行的,则此“上下文”是ASP.NET SynchronizationContext如果此代码在UI线程中执行,则此“上下文”是UI SynchronizationContext
  • ASP.NETSynchronizationContext和UI一次SynchronizationContext只允许一个线程。

因此,当调用代码在return阻塞Task,它将在该上下文中保留一个线程,从而阻止了该线程的Task完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将文件上传到Azure文件存储

来自分类Dev

手动将文件上传到Azure Blob存储

来自分类Dev

将文件上传到Azure Blob存储中

来自分类Dev

如何将VHD并行上传到Azure BLOB存储?

来自分类Dev

如何从Azure的Blob存储将数据上传到Jupyter Notebook?

来自分类Dev

如何跟踪异步文件上传到Azure存储的进度

来自分类Dev

如何跟踪异步文件上传到Azure存储的进度

来自分类Dev

无法从HTML上传将图像上传到Azure Blob

来自分类Dev

从SAS URL上传到Azure Blob存储返回404状态

来自分类Dev

使用Javascript将Largefile上传到Azure Blob

来自分类Dev

将Vhd批量上传到Azure页面Blob

来自分类Dev

Windows Azure-使用队列将文件上传到Blob

来自分类Dev

使用NodeJS(CompoundJS)将Blob上传到Windows Azure容器

来自分类Dev

使用不带Azure SDK的REST API将流上传到Azure Blob存储

来自分类Dev

通过Web API将文件上传到Azure文件存储

来自分类Dev

无法将VHD文件上传到Azure存储

来自分类Dev

通过Web API将文件上传到Azure文件存储

来自分类Dev

将文件上传到 Azure 存储文件共享的脚本

来自分类Dev

将文件从客户端上传到Azure Blob存储| MVC

来自分类Dev

如何使用Python SDK将大文件(〜100mb)上传到Azure blob存储?

来自分类Dev

如何使用Python将文件夹递归上传到Azure Blob存储

来自分类Dev

如何使用python sdk将字符串直接上传到Azure存储Blob?

来自分类Dev

使用BlobContainerClient通过Blob存储将大量文件上传到Azure

来自分类Dev

如何使用Python SDK将大文件(〜100mb)上传到Azure Blob存储?

来自分类Dev

如何使用C#将数据表上传到Azure Blob存储?

来自分类Dev

Azure Powershell - 如何使用“只写”共享访问签名 (SAS) 将文件上传到 Blob 存储?

来自分类Dev

将文件从 angular 应用程序上传到 azure 函数,然后坚持到 blob 存储

来自分类Dev

即使调用Task.WaitAll(task),也不会阻止异步上传到Azure

来自分类Dev

将相同文件上传到Azure Blob存储而不会覆盖?

Related 相关文章

  1. 1

    将文件上传到Azure文件存储

  2. 2

    手动将文件上传到Azure Blob存储

  3. 3

    将文件上传到Azure Blob存储中

  4. 4

    如何将VHD并行上传到Azure BLOB存储?

  5. 5

    如何从Azure的Blob存储将数据上传到Jupyter Notebook?

  6. 6

    如何跟踪异步文件上传到Azure存储的进度

  7. 7

    如何跟踪异步文件上传到Azure存储的进度

  8. 8

    无法从HTML上传将图像上传到Azure Blob

  9. 9

    从SAS URL上传到Azure Blob存储返回404状态

  10. 10

    使用Javascript将Largefile上传到Azure Blob

  11. 11

    将Vhd批量上传到Azure页面Blob

  12. 12

    Windows Azure-使用队列将文件上传到Blob

  13. 13

    使用NodeJS(CompoundJS)将Blob上传到Windows Azure容器

  14. 14

    使用不带Azure SDK的REST API将流上传到Azure Blob存储

  15. 15

    通过Web API将文件上传到Azure文件存储

  16. 16

    无法将VHD文件上传到Azure存储

  17. 17

    通过Web API将文件上传到Azure文件存储

  18. 18

    将文件上传到 Azure 存储文件共享的脚本

  19. 19

    将文件从客户端上传到Azure Blob存储| MVC

  20. 20

    如何使用Python SDK将大文件(〜100mb)上传到Azure blob存储?

  21. 21

    如何使用Python将文件夹递归上传到Azure Blob存储

  22. 22

    如何使用python sdk将字符串直接上传到Azure存储Blob?

  23. 23

    使用BlobContainerClient通过Blob存储将大量文件上传到Azure

  24. 24

    如何使用Python SDK将大文件(〜100mb)上传到Azure Blob存储?

  25. 25

    如何使用C#将数据表上传到Azure Blob存储?

  26. 26

    Azure Powershell - 如何使用“只写”共享访问签名 (SAS) 将文件上传到 Blob 存储?

  27. 27

    将文件从 angular 应用程序上传到 azure 函数,然后坚持到 blob 存储

  28. 28

    即使调用Task.WaitAll(task),也不会阻止异步上传到Azure

  29. 29

    将相同文件上传到Azure Blob存储而不会覆盖?

热门标签

归档