gpt4 book ai didi

c# - 并行 Azure CloudBlockBlob 操作崩溃(访问冲突)

转载 作者:行者123 更新时间:2023-12-03 03:15:22 26 4
gpt4 key购买 nike

下面的代码示例偶尔会导致访问冲突(5,000 到 10,000 条消息中的 1 条)。使用串行 foreach 而不是 Parallel.ForEach 似乎可以规避该问题。

public void DequeBatch<T>(int count)
{
var messages = this.queueListen.ReceiveBatch(count);
var received = new ConcurrentBag<KeyValuePair<Guid, T>>();

Action<BrokeredMessage> UnwrapMessage = message =>
{
blobName = message.GetBody<string>();
obj = Download<T>(blobName);

received.Add(new KeyValuePair<Guid, T>(new Guid(blobName), obj));
};

// offending operation
Parallel.ForEach(messages, new ParallelOptions { MaxDegreeOfParallelism = count }, UnwrapMessage);
}

public override T Download<T>(string blobName)
{
CloudBlockBlob blob;
lock (this.containerDownloadLock)
{
blob = this.containerDownload.GetBlockBlobReference(blobName);
}

T result;
using (var stream = new MemoryStream())
{
blob.DownloadToStream(stream);
stream.Position = 0;
result = Decompress<T>(stream); // dehydrate an object of type T from a GZipStream
}
return result;
}

Q1:导致上述代码线程不安全的问题部分是什么?

问题 2:并行上传和下载 CloudBlockBlob 的正确且安全的方法是什么?

编辑

今天,上面概述的代码遇到了死锁。在调试器中点击全部中断后,我观察到所有执行 blob.DownloadToStream(stream); 的工作线程都被困在了

System.Net.AutoWebProxyScriptEngine.EnterLock

除了被阻止的(没有异常(exception)或其他任何情况)

System.Net.WinHttpProxyFinder.WinHttpGetProxyForUrl

最佳答案

异常System.AccessViolationException只能源自非托管代码或不安全的托管代码。上面的内容是正常(即安全)的托管代码,因此您现在不应该仔细检查该代码,而应关注其他可能性:

  1. 您的应用中是否存在任何非托管或不安全的代码?如果是这样,这可能是内存损坏的原因,这反过来又会导致访问冲突。 Test your app under paged heap and GFlags
  2. 在调试器下执行您的应用程序并收集故障转储。查看故障转储并检查调用堆栈中是否有熟悉的代码。 Windgb 的 !analyze 命令会自动为您进行分析。您必须知道如何修复您和第 3 方库的符号。示例是 here
  3. 这可能是 Microsoft Blob 实现中的一个错误。

如果您合理地排除了 #1 和 #2,并且怀疑 #3 可能是问题所在,则您应该收集故障转储并将其发送给 Microsoft,只有他们才能在这种情况下提供帮助。

关于c# - 并行 Azure CloudBlockBlob 操作崩溃(访问冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28215835/

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