【问题标题】:Close Memory Stream with async Task Azure使用异步任务 Azure 关闭内存流
【发布时间】:2018-03-13 17:00:52
【问题描述】:

我有一个将 base64 图像上传到 Azure 的 Web Api 功能,我使用异步任务方法来做到这一点。问题是代码执行被 await 字卡住了,并且永远不会关闭流,即使在上传照片之后我也没有收到任何错误。

    public async Task<bool> UploadImage(string filename, MemoryStream uploadStream)
    {
            var blobClient = ConnectToAzure();
            CloudBlobContainer imagContainer = blobClient.GetContainerReference(Container);
            CloudBlockBlob blockBlob = imagContainer.GetBlockBlobReference(filename);
            blockBlob.Properties.ContentType = "image/jpg";                                                
            await blockBlob.UploadFromStreamAsync(uploadStream);
            uploadStream.Close();

            return true;
    }

【问题讨论】:

  • 你确定它卡住而不是 uploading 吗? await 表示程序将等待异步,即不会阻塞其他线程,绝对不会阻塞主线程。完成后在原始执行上下文中恢复执行。
  • 顺便说一句,您的代码发送的是 JPG 图像,而不是 Base64。 Based64 是文本。
  • 我的第一个猜测是你不小心忽略了异常。在 'await blockBlob.UploadFromStreamAsync(uploadStream);' 周围添加 try/catch并将断点放入 catch

标签: c# asp.net-web-api2 task-parallel-library


【解决方案1】:

如果你在MVC/WebAPI Action Method中调用UploadImage(...),这个action也应该是异步的

【讨论】:

    【解决方案2】:

    您的 uploadStream 对象的生命周期可能会在调用您的 await blockBlob.UploadFromStreamAsync(uploadStream) 方法后立即结束,从而导致您的 UploadImage() 方法早于预期退出/结束。您能否尝试将您的代码移动到 UploadImage() 方法的父范围?

    【讨论】:

    • 不,await 确保只有在 UploadFromStreamAsync 完成之后才会继续执行。
    • 是的,但是uploadStream 是MemoryStream 类型而不是FileStream。这就是为什么我怀疑这是根本原因。也许我错了。
    • streamawait 有什么关系?
    • 老实说,我不确定这个 UploadFromStreamAsync() 方法。几天前我遇到了类似的问题,但我的场景是 using (memoryStream) { ... await blockBlob.UploadFromStreamAsync(memoryStream); memoryStream.Close(); }。我的“memoryStream.Close()”行从来没有毫无例外地执行过,我必须“解包”(不使用)using 块以使该异步方法和 memoryStream 在同一范围内使其工作。这对我来说很奇怪......
    • 如果您不确定自己的代码,请不要发布答案。顺便说一句,这不是答案。充其量应该是评论。无论如何,await 的行为方式没有任何不确定性。并且不需要在using 块内显式调用Close(),即Dispose()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多