【问题标题】:getting AccessViolationException in IOCompletionCallback在 IOCompletionCallback 中获取 AccessViolationException
【发布时间】:2014-08-21 18:07:29
【问题描述】:

应用程序启动时出现以下异常:

System.AccessViolationException
   at System.Threading.Overlapped.get_iocbHelper()
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

这就是整个调用堆栈。它只会在应用程序启动时发生二十分之一的运行。我确实在我的套接字代码中使用了 IOCompletion。我认为它与此有关。但是,为什么当我调用Socket.ReceiveFromAsync 时不会显示此异常?我有很多套接字同时调用ReceiveFromAsync,但我不会同时在同一个套接字上调用它两次。关于原因的任何想法?

【问题讨论】:

  • 这是一个开始.. 如果我们看不到正在调用的内容和/或您正在使用的特定调用,并且Tasks() 也基于此行,则发布相关代码调用堆栈在这一点上毫无意义at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 我几乎可以猜到这是POINTER 问题
  • 这个项目是什么版本的.net框架..2.0, 3.5, 4.0..??
  • 这是带有 VS2012 的 .NET 4.5.0。我不知道在没有附加调试器的情况下会发生此错误,但我有点怀疑。
  • 此代码在传输完成时运行,就在调用 Completed 事件处理程序之前。这是一个环境问题,你需要让你的机器再次稳定。从想要参与网络、反恶意软件、防火墙的常规垃圾软件列表开始。

标签: c# sockets io-completion-ports


【解决方案1】:

在非常努力地让 IO-completion 方法工作之后,我终于放弃了,只是编写了自己的线程来调用同步版本的发送和接收。从那以后我没有遇到任何问题。

我有一些使用 IO 完成的 C++ 代码,甚至在大容量设置中,我从来没有遇到过这个问题。

所以我很清楚 IO 完成的 C# 实现存在漏洞,它不是反恶意软件、防火墙或任何(非 Microsoft)垃圾软件。

【讨论】:

  • 这只是您的建议,没有任何证据。我怀疑微软代码写得这么糟糕,以至于你是第一个发现这个“错误”的人。您的代码中很可能存在严重错误。
  • @Elmue:受影响的代码归结为创建 AsyncCallback 并将其传递给 BeginSend(),这导致调用 EndSend(),而不是从消息循环线程调用 Send() . “我的代码中存在严重错误”的空间并不大。
  • 这就是你的异常被抛出的地方。但是错误的原因可能是代码中的另一个地方,它稍后会引发异常。因此,如果您不发布可用于重现此问题的代码,您将永远无法在 Stackoverflow 上得到答案。我在我的代码中大量使用 BeginSend() 和 EndSend() 没有问题。所以它与你的代码有关,我们不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多