我的目标.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)
根据我的理解,这些被称为对象类型NamedPipeServerStream
和PipeStream
中的每一个都使用System.IO.Pipes
并尝试/捕获它们。我认为,由于这是一个异步调用,因此创建一个线程来处理稍后的函数。由于它们是自己的线程,这可以解释为什么在最初调用它时它不会被捕获到try / catch中。这也可以解释为什么错误不会追溯到try / catch中的语句。
这给我留下了一个问题,是否有任何方法可以避免或捕获此异常以防止程序崩溃?