【问题标题】:Azure downloadtostreamasync method hangsAzure downloadtostreamasync 方法挂起
【发布时间】:2015-04-16 01:37:58
【问题描述】:

这是有问题的代码

    public async static Task<MemoryStream> AsyncReadBlob(string identifier)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageString);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        MemoryStream memstream = new MemoryStream();
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(identifier);
        await blockBlob.DownloadToStreamAsync(memstream);
        return memstream;
    }

基本上,如果我替换,代码运行完全正常

await blockBlob.DownloadToStreamAsync(memstream)

blockblob.DownloadToStream(memstream)

blockblob.DownloadToStreamAsync(memstream).wait()

但是当我使它异步时,“下载到流”步骤永远不会完成。我也尝试过使用 DownloadToStreamBegin(),然后等待它完成,但它永远不会再次完成。

它是不是因为它是一个静态方法而不起作用?还是因为它的 memstream 正在从内存中取消引用或其他什么??

我使用的是 asp.net 4.5,所有编译正常,没有抛出解释器错误或异常。

任何帮助将不胜感激

【问题讨论】:

  • 使用await关键字意味着主线程将被释放以允许处理其他事情,函数的执行将在它完成之前不会继续。所以你应该在方法DownloadToStreamAsync 上调用await!状态机会记住当前执行的位置,即 await 块,然后在异步方法完成后返回它。
  • 我在 DownloadToStreamAsync 上使用 await ??
  • 您应该尝试 3 个示例来说明您尝试执行相同功能的方式,而我所说的是为什么您应该使用 await,我只是想对这个主题提供更多的理解

标签: c# asynchronous azure-storage azure-blob-storage asp.net-4.5


【解决方案1】:

短版...使用:

 await blockBlob.DownloadToStreamAsync(memstream).ConfigureAwait(false);

长版:

当您在 C# 中等待任务时,任务调度程序将尝试在调用原始等待的同一线程中执行等待之后的代码块。

问题是在某些情况下(现在无法回忆具体情况)ASP.NET 线程调度程序会在等待任务返回时阻塞线程。当任务返回时,任务阻塞等待原线程被释放,而线程阻塞等待任务结束。所以你结束了僵局。

ConfigureAwait 允许您停用该行为。

【讨论】:

【解决方案2】:

几乎可以肯定,您的代码正在调用Task&lt;T&gt;.ResultTask.Wait,从AsyncReadBlob 进一步向上调用堆栈,正是这个阻塞代码导致了死锁。我更详细地描述了这个场景on my blog

正确的解决方案是将所有ResultWait 调用替换为await

【讨论】:

  • 是的。 asyncreadblob 的调用者使用了 await,调用者使用了 await,调用者使用了 await,但是其中一个调用者使用了 .Result 我很欣赏你的回答在一般情况下可能更正确,除了我确实想运行这个 async同步方法,所以... configureAwait 对我更有用。我要重新设计,所以我不会从 Masterpage 调用这个方法(masterpage 不喜欢异步方法),然后我会使用你的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多