C# 调用StartCopySync时发生StackOverflow异常
我正在编写一个控制台应用程序,它可以复制给定的blob,代码如下:C# 调用StartCopySync时发生StackOverflow异常,c#,azure-storage-blobs,C#,Azure Storage Blobs,我正在编写一个控制台应用程序,它可以复制给定的blob,代码如下: var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; var blobClient = storageAccount.CreateCloudBlobClient(); var blobContainer = blobClient.GetContainerReference(containerName); var sourceBlob1 = blo
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var blobClient = storageAccount.CreateCloudBlobClient();
var blobContainer = blobClient.GetContainerReference(containerName);
var sourceBlob1 = blobContainer.GetBlockBlobReference("SOURCE1.txt");
var targetBlob1 = blobContainer.GetBlockBlobReference("TARGET1.txt");
await targetBlob1.StartCopyAsync(sourceBlob1, null, null, null, null, CancellationToken.None).ConfigureAwait(false);
var sourceBlob2 = blobContainer.GetPageBlobReference("SOURCE2.txt");
var targetBlob2 = blobContainer.GetPageBlobReference("TARGET2.txt");
await targetBlob2.StartCopyAsync(sourceBlob2, null, null, null, null, CancellationToken.None).ConfigureAwait(false);
应用程序成功复制块blob,但在尝试复制页面blob时,由于StackOverflow异常而崩溃
知道为什么在复制页面blob时会出现StackOverflow异常,而在复制块blob时却不会出现吗
编辑:我创建了一个简单的控制台应用程序来重现这个问题。下面是program.cs:
using Microsoft.WindowsAzure.Storage;
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var blobClient = storageAccount.CreateCloudBlobClient();
var blobContainer = blobClient.GetContainerReference("mycontainer");
var sourceBlob = blobContainer.GetPageBlobReference("SOURCE.txt");
var targetBlob = blobContainer.GetPageBlobReference("TARGET.txt");
targetBlob.StartCopyAsync(sourceBlob, null, null, null, null, CancellationToken.None).Wait();
}
}
}
这里是ConsoleApp1.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="WindowsAzure.Storage" Version="8.7.0" />
</ItemGroup>
</Project>
Exe
netcoreapp2.0
下面是我运行此控制台应用程序时的结果:
Visual Studio中的输出窗口显示以下内容:
“System.StackOverflowException”类型的未处理异常
发生在Microsoft.WindowsAzure.Storage.dll中
看来这是个问题。我还可以使用WindowsAzure.Storage version>=8.2.0在我这边复制它。
如果可以降级Azure storage SDK版本,请使用,然后它将按预期工作。我在昨晚打开的网站上收到一位Microsoft人员的回复:他们承认此问题是Azure storage SDK中的回归错误
当我们等待问题得到解决时,他们建议使用不同的方法重载来解决问题。但是,正如@tom sun所建议的,我可以降级到SDK的早期版本。是的,StackOverflowException会阻止您复制页面blob,这是有原因的:它会使应用程序崩溃。我建议您找出什么是递归,并阻止它这样做。除了无限递归之外,堆栈溢出的原因并不多。这涉及到我们可以看到的方法调用。这意味着向我们展示(我猜)单个方法的代码不会帮助我们识别原因。至少,我们需要看到当前方法的形式签名,该代码存在于其中。@desautelsj严肃地说,正如Damian所说,答案几乎肯定会涉及无限递归,因此答案必须包括弄清楚是什么在做,以及为什么要做。如果没有更多的代码,我们所能做的就是提供毫无价值的猜测。我的第一个猜测是,有两个对象相互引用,因此对象图实际上是无限的。我建议您花一段时间阅读一句话(如果您有时间的话)-“选择没有中断”-也就是说,框架方法包含之前没有人发现的免费bug的可能性非常小。因此,您需要努力工作,并证明不是您的代码被破坏。也就是说,(2)故障源不太可能是
startcopyanc
,您可以附加一个调试器,然后运行直到出现异常,然后在Visual Studio中打开“调用堆栈”窗口并查看调用堆栈。这可能会给你更多关于这个问题的信息。