gpt4 book ai didi

c# - Azure downloadtostreamasync 方法挂起

转载 作者:可可西里 更新时间:2023-11-01 08:36:26 26 4
gpt4 key购买 nike

这是有问题的代码

    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;
}

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

等待 blockBlob.DownloadToStreamAsync(memstream)

blockblob.DownloadToStream(memstream)

blockblob.DownloadToStreamAsync(memstream).wait()

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

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

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

任何帮助将不胜感激

最佳答案

简短版本...使用:

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

长版:

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

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

ConfigureAwait允许您停用该行为。

关于c# - Azure downloadtostreamasync 方法挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28526249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com