- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究无锁堆栈和队列数据结构,我可以在其中放置任意数量的添加项目并在一次调用中收集所有项目,我认为我的设计是可靠的并且它按预期工作直到我开始收到一个意外的异常,我认为这在纯 C# 环境中是不可能的:
托管调试助手“FatalExecutionEngineError”检测到问题附加信息:运行时遇到 fatal error 。错误地址位于线程 0x16f0 上的 0x6caf6ac7。错误代码是 0xc0000005。此错误可能是 CLR 中的错误,或者是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户编码错误,这可能会损坏堆栈。
我似乎无法找到它发生的方式,想知道是否有人可以指导我找出错误的原因:
这是 stackbulkcollector 的实现:
public class StackBulkCollector<T> : IBulkCollector<T>
{
class Node
{
public T value;
private bool m_isSet;
private Node m_prev;
public Node(T data)
{
value = data;
}
public Node()
{
}
public Node Prev
{
set
{
m_prev = value;
m_isSet = true;
}
get
{
if (!m_isSet)
{
SpinWait s = new SpinWait();
while (!m_isSet)
{
s.SpinOnce();
}
}
return m_prev;
}
}
}
class Enumerable : IEnumerable<T>
{
private Node m_last;
public Enumerable(Node last)
{
m_last = last;
}
public IEnumerator<T> GetEnumerator()
{
return new Enumerator(m_last);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return new Enumerator(m_last);
}
}
class Enumerator : IEnumerator<T>
{
private readonly Node m_last;
private Node m_current;
public Enumerator(Node last)
{
var node = new Node();
m_current = m_last = node;
node.Prev = last;
}
public T Current
{
get { return m_current.value; }
}
public void Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get { return this; }
}
public bool MoveNext()
{
if (m_current == null)
{
return false;
}
m_current = m_current.Prev;
return m_current != null;
}
public void Reset()
{
m_current = m_last;
}
}
private Node m_last;
public void Add(T data)
{
var node = new Node(data);
node.Prev = Interlocked.Exchange(ref m_last, node);
}
public IEnumerable<T> GetBulk()
{
var last = Interlocked.Exchange(ref m_last, null);
return new Enumerable(last);
}
}
这是我用来测试它的测试程序:
class Program
{
public static readonly int UseThreads = 4;
public static readonly TimeSpan Duration = new TimeSpan(0,0,0,3);
public static long[] AddedItems = new long[UseThreads];
static void Main(string[] args)
{
IBulkCollector<TestData> bulkCollector = new QueuedBulkCollector<TestData>();
while (true)
{
using (var countdownEvent = new CountdownEvent(UseThreads + 1))
{
var results = new Dictionary<int, List<TestData>>();
if (bulkCollector is QueuedBulkCollector<TestData>)
{
bulkCollector = new StackBulkCollector<TestData>();
Console.WriteLine("Starting StackBulkCollector Test");
}
else
{
bulkCollector = new StackBulkCollector<TestData>();
Console.WriteLine("Starting QueuedBulkCollector Test");
}
for (int i = 0; i < UseThreads; i++)
{
results[i] = new List<TestData>();
Thread t = new Thread(PushTestData);
t.Start(new object[] {i, bulkCollector, countdownEvent});
}
var start = DateTime.Now;
Thread readerThred = new Thread(() =>
{
while ((DateTime.Now - start) <
(Duration - new TimeSpan(0, 0, 0, 0, 100)))
{
foreach (var testData in bulkCollector.GetBulk())
{
results[testData.Id].Add(testData);
}
//Console.WriteLine("Doing Some Read {0}", currBulk.Count);
System.Threading.Thread.Sleep(10);
}
countdownEvent.Signal();
});
readerThred.Start();
countdownEvent.Wait();
var lastBulk = bulkCollector.GetBulk().ToList();
foreach (var testData in lastBulk)
{
results[testData.Id].Add(testData);
}
Console.WriteLine("Doing Last Read {0}", lastBulk.Count);
long[] value = new long[UseThreads];
long totalCount = 0;
int errorCount = 0;
for (int i = 0; i < UseThreads; i++)
{
value[i] = AddedItems[i];
totalCount += value[i];
Console.WriteLine("Thread {0} Push {1} Items", i, value[i]);
var verifyArray = results[i].OrderBy(p => p.Value).ToList();
if (verifyArray.Count != value[i])
{
Console.WriteLine("Not Working Count miss match");
errorCount++;
}
else
{
var expected = 0;
foreach (var testData in verifyArray)
{
if (expected != testData.Value)
{
Console.WriteLine("NotWorking");
errorCount++;
}
expected++;
}
}
}
Console.WriteLine("Done Total Push {0} with {1} errors.", totalCount.ToString("#,##0") , errorCount);
if (errorCount != 0)
{
Console.ReadKey();
}
}
}
}
private static void PushTestData(object o)
{
object[] parms = o as object[];
int id = (int)parms[0];
IBulkCollector<TestData> bulkCollector = (IBulkCollector<TestData>)parms[1];
CountdownEvent endEvetn = (CountdownEvent)parms[2];
AddedItems[id] = 0;
var start = DateTime.Now;
while ((DateTime.Now - start) < Duration)
{
bulkCollector.Add(new TestData() { Id = id, Value = AddedItems[id]});
AddedItems[id]++;
}
endEvetn.Signal();
}
}
我们非常欢迎任何建议。
最佳答案
抱歉,内存条有缺陷是问题的原因,已更换,问题已解决。
关于c# - 锁定释放 BulkCollector 和 FatalExecutionEngineError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661949/
我收到以下错误: Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\Users
今天我正在调试我的一些代码,这些代码构建了一些 ExpressionTrees,将它们编译为可调用的委托(delegate),然后在需要时调用它们。在执行此操作时,我遇到了 FatalExecutio
我在尝试将许多 DBase IV 文件中的 memofields 中的 C++ 结构读取到 C# (.Net 4) 中,然后将它们插入 MSSQL 2008 中时遇到了问题。数据正在从 DBase 文
这是我得到执行错误的行: NimbieImportedFunctions.BS_Robots_Connect( out robotCount, out robotIDs, out robotT
当我调试 ASP.NET MVC 应用程序时,KeyVaultClient 随机抛出异常: Managed Debugging Assistant 'FatalExecutionEngineError
托管调试助手“FatalExecutionEngineError”:“运行时遇到 fatal error 。错误的地址是 0x641ad419,在线程 0x5d0c 上。错误代码是 0xc000000
我需要在 C# 中使用 win32 NetLocalGroupGetMembers。我找到并测试了三种解决方案。这三个都因 FatalExecutionEngineError 而失败。框架是.net
我正在用 C# 例程试验一个我无法解决的乏味问题。我正在开发一个应用程序,它使用 GDAL 库(一个用 C++ 编写的 DLL 库来操作地理数据)打开 ESRI ShapeFile,并在 Pictur
几周(几个月?)以来,在 Visual Studio 2017/2019 Enterprise 中重新启动我的 ASP.NET 应用程序后,我有时会遇到以下异常。只有当 IIS Express 已经在
我正在开发一个连接到 MySQL 数据库的 C#.NET 应用程序,并使用一些不安全的代码来使用旧的 C++ dll。 程序一启动,就会加载dll并分配一个指针,然后初始化一些C#变量,然后删除指针。
作为我论文的一部分,我正在开发一个客户端/服务器应用程序,并选择使用 SocketAsyncEventArgs 来获得网络操作方面的最大性能。今天下午,我决定对创建 20 个线程并为每个线程发送 10
在我的程序中这一行: int value = MTEConnect(auth_string, err); 我收到这样的异常: FatalExecutionEngineError The runtime
我们正在使用一个封装数值的结构,我发现当在表达式中使用该结构的可空版本时,会发生 FatalExecutionEngineError: Additional information: The runt
我即将为用 VBScript 编写的遗留系统启动一个正在工作的迁移项目。它有一个有趣的结构,其中大部分是通过将各种组件编写为“WSC”文件来隔离的,这实际上是一种以类似 COM 的方式公开 VBScr
我正在研究无锁堆栈和队列数据结构,我可以在其中放置任意数量的添加项目并在一次调用中收集所有项目,我认为我的设计是可靠的并且它按预期工作直到我开始收到一个意外的异常,我认为这在纯 C# 环境中是不可能的
在 AnyCPU 或 x86 上,我可以运行这个程序,在 Foo 上设置一个断点,将第一个参数从 0.5f 编辑到 0.6f,然后恢复就好了。 但是,在 x64 上,它在恢复时始终因 FatalExe
我有以下基本 XAML: 当我尝试关闭包含用户控件的选项卡时,出现以下错误: Managed Debugging Assistant 'FatalExecut
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
当我尝试调试我的项目时,我不断收到此错误消息。相同的代码适用于大学机器。我目前使用 Windows 8.1 和 resharper 8.2,并在 selenium 测试中使用了最初的几种方法。我也在使
我正在尝试(为了好玩)将 String.Empty 重新定义为单个空格“”。为什么这会破坏 CLR 框架? 留言: The runtime has encountered a fatal error.
我是一名优秀的程序员,十分优秀!