C# 调用StartCopySync时发生StackOverflow异常

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

我正在编写一个控制台应用程序,它可以复制给定的blob,代码如下:

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中打开“调用堆栈”窗口并查看调用堆栈。这可能会给你更多关于这个问题的信息。