为什么我从Asynchronous Callbacks的System.IO.Pipes中获取IOException?

时间:2017-08-02 23:41:22

标签: c# .net visual-studio asynchronous system.io.file

我的目标.NET框架设置为4.0,这可能是因为我的程序在System.IO.Pipes资源中崩溃可能发生的原因。这个错误从来没有能够重复,每周最多发生几次。

崩溃然后重新启动服务,并且有两次此错误。两者都在System.Threading._IOCompletionCallback.PerformIOCompletionCallback

的最深处失败了

第一次出现在System.IO.Pipes.NamedPipeServerStream.AsyncWaitForConnectionCallback

这段代码处理最终在方法中调用的对象。

protected override IAsyncResult BeginWaitForConnection(AsyncCallback callback, object state)
{
    try
    {
         return PipeServer.BeginWaitForConnection(callback, state);
    }
    catch (Exception e)
    {
         PipeServer.Dispose();
         PipeServer = null;
         throw;
    }
}

PipeServer的类型为NamedPipeServerStream

try / catch中的语句运行得很好,但稍后线程会抛出错误。我相信因为它是一个异步调用,所以它调用一个方法,后来不是围绕try / catch(在这种情况下在System.IO.Pipes.NamedPipeServerStream内)。

似乎解决此问题的唯一方法是在System.IO.Pipes.NamedPipeServerStream 中的代码段中添加try / catch,以便在出现异常时进行处理,资源没有被编程处理。 这是不可能的,因为这些二进制文件不可修改。

以下是第一次出现的日志中抛出的完整错误。

There are no context policies.
. Exiting!
System.IO.IOException: The handle is invalid.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.Threading.EventWaitHandle.Set()
at System.IO.Pipes.NamedPipeServerStream.AsyncWaitForConnectionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

IOException的第二次出现是在 System.IO.Pipes.PipeStream.AsyncPSCallback,这也是最终使用异步回调的方法。

找到异步回调的给定代码用于下面的代码段。

public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
{
     return NamedPipeStream.BeginRead(buffer, offset, count, callback, state);
}

NamedPipeStream的类型为PipeStream

过了一段时间,这是连接到该语句的完整错误。

There are no context policies.
. Exiting!
System.IO.IOException: The handle is invalid.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.Threading.EventWaitHandle.Set()
at System.IO.Pipes.PipeStream.AsyncPSCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

根据我的理解,这些被称为对象类型NamedPipeServerStreamPipeStream中的每一个都使用System.IO.Pipes并尝试/捕获它们。我认为,由于这是一个异步调用,因此创建一个线程来处理稍后的函数。由于它们是自己的线程,这可以解释为什么在最初调用它时它不会被捕获到try / catch中。这也可以解释为什么错误不会追溯到try / catch中的语句。

这给我留下了一个问题,是否有任何方法可以避免或捕获此异常以防止程序崩溃?

0 个答案:

没有答案