首页 新闻 会员 周边

请问高手们一个关于用C#写的windows 服务的怪异问题.

0
[已解决问题] 解决于 2012-03-30 14:28

本人使用.NET的异步socket写了个socket服务端.若使用winform作为容器.挂起socket的实例是完全没问题的.但是使用了windows的服务挂起该异步socket后,便产生如下问题
- <Event xmlns="http://schemas.microsoft.com/win/2004...
- <System>
<Provider Name=".NET Runtime" />
<EventID Qualifiers="0">1026</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2012-03-29T12:56:47.000000000Z" />
<EventRecordID>33552</EventRecordID>
<Channel>Application</Channel>
<Computer>PigWing-PC</Computer>
<Security />
</System>
- <EventData>
<Data>应用程序: YzPLCDataSourceService.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常,进程终止。异常信息: System.ObjectDisposedException 堆栈: 在 System.Net.Sockets.Socket.AcceptAsync(System.Net.Sockets.SocketAsyncEventArgs) 在 FpWinServer.FPWinSocketListener.StartAccept(System.Net.Sockets.SocketAsyncEventArgs) 在 FpWinServer.FPWinSocketListener.ProcessAccept(System.Net.Sockets.SocketAsyncEventArgs) 在 FpWinServer.FPWinSocketListener.OnAcceptCompleted(System.Object, System.Net.Sockets.SocketAsyncEventArgs) 在 System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(System.Net.Sockets.SocketAsyncEventArgs) 在 System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(System.Object) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 在 System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(System.Net.Sockets.SocketError, Int32, System.Net.Sockets.SocketFlags) 在 System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) 在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)</Data>
</EventData>
</Event>
请问高手们,这是什么问题呢?非常怪异

pigwing的主页 pigwing | 初学一级 | 园豆:168
提问于:2012-03-29 21:10
< >
分享
最佳答案
1

从异常信息上看,可能是你用了异步模式,而过早的销毁了SocketListener实例。在winform中和在windows service中是一样的。

奖励园豆:5
玉开 | 大侠五级 |园豆:8822 | 2012-03-29 21:15

但是.我并无销毁SocketListener实例.因为在winfrom中的启动方式跟windows service是一样的.并无调用销毁实例的method.所以感觉非常怪异.

pigwing | 园豆:168 (初学一级) | 2012-03-29 21:34

@pigwing: 

 System.ObjectDisposedException 通常是要使用的对象已经调用过Dispose方法,又使用这个对象抛出的异常。你有没有用using()和这儿相关的对象, 如果有的话也是可能的。

玉开 | 园豆:8822 (大侠五级) | 2012-03-29 21:39

@玉开: 哦?但是我并无使用using方法进行实例销毁.奇怪的是.我是把windows service中的代码.完全复制到winfrom中,使用winfrom容器挂起异步socket.在winfrom容器的环境下.不会出现此异常.并且我的目标框架已经调成不带client profile的完整版的framework4.

pigwing | 园豆:168 (初学一级) | 2012-03-29 21:43

@pigwing: 

那设断点调试吧。在windows 服务中可以通过Debuger.Break()自动加载调试器。

玉开 | 园豆:8822 (大侠五级) | 2012-03-29 21:45

@pigwing: 

可以跟踪到异常,看看到底是在访问那个对象时,抛出了ObjectDisposedException异常。

玉开 | 园豆:8822 (大侠五级) | 2012-03-29 21:46

@玉开: 还有一怪异问题是.我的服务在本机测试,跑了一个多月,并无发生自动停止的情况.但是在服务器上跑,便出现自动停止的情况.

pigwing | 园豆:168 (初学一级) | 2012-03-29 22:43

@pigwing: 

这种问题十有八九是因为你的服务中用了多线程,在某个线程中出现了未处理异常,导致程序自动终止。通常可以在windows的事件查看器中查到日志。

玉开 | 园豆:8822 (大侠五级) | 2012-03-30 08:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册