Window服务中止 错误

superfrank0711 2015-02-11 04:26:42
Application: Jinri.AutoTicket.RefundTicketService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
at Jinri.Framework.CommandRunner.WorkerBase.DoWork()
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.runTryCode(System.Object)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()



...全文
526 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
superfrank0711 2015-02-12
  • 打赏
  • 举报
回复

/// <summary>
        /// 发送http请求
        /// </summary>
        /// <param name="paras">请求参数</param>
        /// <param name="serverID">出票服务器ID</param>
        /// <returns>正常返回接口报文的xml字符串,否则返回空串</returns>
        private static AutoRefundTickeResponseInfo SendHttpRequest(string url, string interfaceType, Encoding enc)
        {            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            AutoRefundTickeResponseInfo autoRefundTickeResponseInfo = new AutoRefundTickeResponseInfo();
            if (interfaceType == "YS")
                url = ComSecurity.UrlEncode(url, enc); ;
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.ContentType = "application/x-www-form-urlencoded";
            request.KeepAlive = false;
            request.Timeout = 90000;
            string returnValue = "";
            autoRefundTickeResponseInfo.IsRetry = false;
            try
            {
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                if (response != null)
                {
                    using (System.IO.Stream responseStream = response.GetResponseStream())
                    {
                        using (System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, enc))
                        {
                            returnValue = reader.ReadToEnd();
                            autoRefundTickeResponseInfo.Response = returnValue;
                            autoRefundTickeResponseInfo.IsRetry = false;
                            sw.Stop();
                        }
                    }
                }
                else
                {
                    autoRefundTickeResponseInfo.IsRetry = true;
                }
            }
            catch (TimeoutException te)
            {
                autoRefundTickeResponseInfo.Response = "请求超时";
                autoRefundTickeResponseInfo.IsRetry = false;
                LogManager.WriteException("Jinri.AutoTicket.RefundTicketBussiness.SendRequest.SendHttpRequest_TimeoutException", te, 886688);
            }
            catch (Exception ex)
            {
                autoRefundTickeResponseInfo.IsRetry = false;
                LogManager.WriteException("Jinri.AutoTicket.RefundTicketBussiness.SendRequest.SendHttpRequest", ex, 886688);
            }

            return autoRefundTickeResponseInfo;
        }
superfrank0711 2015-02-12
  • 打赏
  • 举报
回复
引用 15 楼 zq1564171310 的回复:
感觉可能不是dll的问题,检查一下你自己的代码中所有变量或者对象,尽可能的调试所有对象,看看是否都有值。 dll(C,C++)报错一般都是会报System.AccessViolationException 你没有代码,所以只能猜测
我现在是里面有几个线程,没个线程去通过http方式调用第三方的接口,根据我系统时间查看器,查看到的异常信息如下: Timestamp: 2015-2-12 6:52:43 Message: Thread was being aborted. at Jinri.AutoTicket.Comm.SendRequest.SendHttpRequest(String url, String interfaceType, Encoding enc) in E:\TFS\AutomationProject\Branch\20150127\Jinri.AutoTicket.RefundTicket\Jinri.AutoTicket.Comm\SendRequest.cs:line 97 at Jinri.AutoTicket.Comm.SendRequest.SendHttpRequest(String url, String interfaceType, Encoding enc, Int32 retry) in E:\TFS\AutomationProject\Branch\20150127\Jinri.AutoTicket.RefundTicket\Jinri.AutoTicket.Comm\SendRequest.cs:line 38 at Jinri.AutoTicket.RefundTicketTask.RefundDoWork.DoWork(ITaskInfo task) in E:\TFS\AutomationProject\Branch\20150127\Jinri.AutoTicket.RefundTicket\Jinri.AutoTicket.RefundTicketTask\RefundDoWork.cs:line 45 Category: Exception Priority: 4 EventId: 0 Severity: Error Title:Jinri.AutoTicket.RefundTicketTask.RefundDoWork.DoWork() Machine: APP-251 Application Domain: Jinri.AutoTicket.RefundTicketService.exe Process Id: 1184 Process Name: Jinri.AutoTicket.RefundTicketService Win32 Thread Id: 3756 Thread Name: autotickettask1 Extended Properties: SubSystemID - 88<TraceLog> AppID - 886688<TraceLog> ModuleID - 886688<TraceLog> ErrorID - 0<TraceLog> ClientIP - <TraceLog> ErrorType - System.Threading.ThreadAbortException<TraceLog> OrderID - 0<TraceLog> Remark - <TraceLog> 当所有线程都中止掉了之后,所以整个服务进程就死掉了
zq1564171310 2015-02-12
  • 打赏
  • 举报
回复
感觉可能不是dll的问题,检查一下你自己的代码中所有变量或者对象,尽可能的调试所有对象,看看是否都有值。 dll(C,C++)报错一般都是会报System.AccessViolationException 你没有代码,所以只能猜测
qldsrx 2015-02-12
  • 打赏
  • 举报
回复
请检查你的AutoRefundTickeResponseInfo类,这个类的作用和内部的方法是否做好了线程异常处理,你的错误是由这个多线程操作类引发的。
sunny906 2015-02-12
  • 打赏
  • 举报
回复
引用 16 楼 SuperAugus 的回复:
Timestamp: 2015-2-12 6:52:43 Message: Thread was being aborted.
线程里的方法有异常,仔细检查线程的方法体
superfrank0711 2015-02-12
  • 打赏
  • 举报
回复
引用 18 楼 zq1564171310 的回复:
没有环境,凭代码猜测的原因,仅供参考: returnValue = reader.ReadToEnd(); 没有close掉读写流, sw.Stop(); 造成ReadToEnd 可能被无限期阻止 http://www.tuicool.com/articles/yEbYvi
sw在using的,是会被close的,不用在finally的 谢谢!
superfrank0711 2015-02-12
  • 打赏
  • 举报
回复
引用 19 楼 Z65443344 的回复:
Stopwatch是干嘛的 这不是测试代码执行时间用的吗,怎么正式运行,还留着
嗯 对的,这个忘记注释了,呵呵,谢谢!
於黾 2015-02-12
  • 打赏
  • 举报
回复
Stopwatch是干嘛的 这不是测试代码执行时间用的吗,怎么正式运行,还留着
zq1564171310 2015-02-12
  • 打赏
  • 举报
回复
没有环境,凭代码猜测的原因,仅供参考: returnValue = reader.ReadToEnd(); 没有close掉读写流, sw.Stop(); 造成ReadToEnd 可能被无限期阻止 http://www.tuicool.com/articles/yEbYvi
本拉灯 2015-02-11
  • 打赏
  • 举报
回复
引用 13 楼 SPFarm 的回复:
[quote=引用 4 楼 SuperAugus 的回复:] [quote=引用 2 楼 wyd1520 的回复:] X 没代码的,只看出里面的某个对象是空引用了 Jinri.Framework.CommandRunner.WorkerBase.DoWork() 这个方法里面有个对象没有 if(xxx!=null) { xxx.XXX(); } 之前应是xxx.XXX()造成的;
那如果过我在这个dowork()里面套一个try catch的话,是不是能够吃掉异常,从而让进程不中止?[/quote] 加上try catch确实能够吃到异常,进程不终止,但是这个不影响功能吗? 线程起不来了,这个服务还能正常work吗?[/quote] 那你想正常的Work那就要在DoWork里面去判断,try catch只能防服务退出。
SPFarmer 2015-02-11
  • 打赏
  • 举报
回复
引用 4 楼 SuperAugus 的回复:
[quote=引用 2 楼 wyd1520 的回复:] X 没代码的,只看出里面的某个对象是空引用了 Jinri.Framework.CommandRunner.WorkerBase.DoWork() 这个方法里面有个对象没有 if(xxx!=null) { xxx.XXX(); } 之前应是xxx.XXX()造成的;
那如果过我在这个dowork()里面套一个try catch的话,是不是能够吃掉异常,从而让进程不中止?[/quote] 加上try catch确实能够吃到异常,进程不终止,但是这个不影响功能吗? 线程起不来了,这个服务还能正常work吗?
於黾 2015-02-11
  • 打赏
  • 举报
回复
不是有ThreadPool吗
superfrank0711 2015-02-11
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
如果一句不能调试就算解决问题的话 那你这个问题就算解决完了 结论就是反正告诉你哪里有问题你也没有源码,不能改,就那么样吧,每次发现它停了,你就把它启动起来
引用 8 楼 Z65443344 的回复:
如果一句不能调试就算解决问题的话 那你这个问题就算解决完了 结论就是反正告诉你哪里有问题你也没有源码,不能改,就那么样吧,每次发现它停了,你就把它启动起来
我现在要解决的就是不让服务中止,就算ok了,后面我会想办法把这个线程池给替换称task来试试!
於黾 2015-02-11
  • 打赏
  • 举报
回复
try,catch不是万能的 dll出了异常,很可能无法捕捉,依然会崩溃 而且即使能够捕捉,dll里占用的资源不释放,早晚还是内存溢出,还是要崩溃
superfrank0711 2015-02-11
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
.net自带线程池,为什么非要不知道谁封装的,没有源代码,不能调试的dll?
对的,以前的一个Window服务,这个CommandRunner是一个dll
於黾 2015-02-11
  • 打赏
  • 举报
回复
如果一句不能调试就算解决问题的话 那你这个问题就算解决完了 结论就是反正告诉你哪里有问题你也没有源码,不能改,就那么样吧,每次发现它停了,你就把它启动起来
本拉灯 2015-02-11
  • 打赏
  • 举报
回复
引用 4 楼 SuperAugus 的回复:
[quote=引用 2 楼 wyd1520 的回复:] X 没代码的,只看出里面的某个对象是空引用了 Jinri.Framework.CommandRunner.WorkerBase.DoWork() 这个方法里面有个对象没有 if(xxx!=null) { xxx.XXX(); } 之前应是xxx.XXX()造成的;
那如果过我在这个dowork()里面套一个try catch的话,是不是能够吃掉异常,从而让进程不中止?[/quote] 是地。可以吃掉他。进程就不中止了
於黾 2015-02-11
  • 打赏
  • 举报
回复
.net自带线程池,为什么非要不知道谁封装的,没有源代码,不能调试的dll?
superfrank0711 2015-02-11
  • 打赏
  • 举报
回复
CommandRunner 这个是一个封装后的线程池处理,我这边也没有源代码!没办法调试进去
superfrank0711 2015-02-11
  • 打赏
  • 举报
回复
引用 2 楼 wyd1520 的回复:
X 没代码的,只看出里面的某个对象是空引用了 Jinri.Framework.CommandRunner.WorkerBase.DoWork() 这个方法里面有个对象没有 if(xxx!=null) { xxx.XXX(); } 之前应是xxx.XXX()造成的;
那如果过我在这个dowork()里面套一个try catch的话,是不是能够吃掉异常,从而让进程不中止?
加载更多回复(3)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧