Azure downloadtostreamasync 方法挂起
Azure downloadtostreamasync method hangs
这是有问题的代码
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()
但是当我将其设为异步时,"download to stream" 步骤永远不会完成。我也试过使用 DownloadToStreamBegin() 然后等待它也完成,但它永远不会完成,再一次。
它不起作用是因为它是一个静态方法吗?或者是因为它的 memstream 正在从内存中取消引用还是什么??
我正在使用 asp.net 4.5,所有编译都正确,没有解释器错误或异常抛出。
如有任何帮助,我们将不胜感激
短版...使用:
await blockBlob.DownloadToStreamAsync(memstream).ConfigureAwait(false);
长版:
当您在 C# 中等待任务时,任务计划程序将尝试在调用原始 await 的同一线程中执行等待之后的代码块。
问题是在某些情况下(现在不记得具体情况)ASP.NET 线程调度程序会在等待任务 return 时阻塞线程。当任务returns时,任务阻塞等待原线程释放,而线程阻塞等待任务结束。于是你们就僵局了。
ConfigureAwait 允许您停用该行为。
您的代码几乎可以肯定正在调用 Task<T>.Result
或 Task.Wait
从 AsyncReadBlob
调用堆栈的更上层,正是这个阻塞代码导致了死锁。我更详细地描述了这种情况 on my blog。
正确的解决方案是将所有 Result
和 Wait
调用替换为 await
。
这是有问题的代码
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()
但是当我将其设为异步时,"download to stream" 步骤永远不会完成。我也试过使用 DownloadToStreamBegin() 然后等待它也完成,但它永远不会完成,再一次。
它不起作用是因为它是一个静态方法吗?或者是因为它的 memstream 正在从内存中取消引用还是什么??
我正在使用 asp.net 4.5,所有编译都正确,没有解释器错误或异常抛出。
如有任何帮助,我们将不胜感激
短版...使用:
await blockBlob.DownloadToStreamAsync(memstream).ConfigureAwait(false);
长版:
当您在 C# 中等待任务时,任务计划程序将尝试在调用原始 await 的同一线程中执行等待之后的代码块。
问题是在某些情况下(现在不记得具体情况)ASP.NET 线程调度程序会在等待任务 return 时阻塞线程。当任务returns时,任务阻塞等待原线程释放,而线程阻塞等待任务结束。于是你们就僵局了。
ConfigureAwait 允许您停用该行为。
您的代码几乎可以肯定正在调用 Task<T>.Result
或 Task.Wait
从 AsyncReadBlob
调用堆栈的更上层,正是这个阻塞代码导致了死锁。我更详细地描述了这种情况 on my blog。
正确的解决方案是将所有 Result
和 Wait
调用替换为 await
。