end_sun 2017-09-03 01:28 采纳率: 0%
浏览 6477

c# winform 多线程异常无法捕获,导致程序闪退

伪代码为:
try
{
if (helper.TogetherBookThread != null && helper.TogetherBookThread.IsAlive) { return; }

            helper.TogetherBookThread = new Thread(new ThreadStart(delegate()
            {
                try
                {
                    while (true)
                    {

                        if (helper.TicketQuery != null)
                        {

                            Dictionary<string, TicketOrderCSun> TicketOrderCSunDic = helper.TicketQuery.TicketOrderCSunDic;
                            foreach (var cSun in TicketOrderCSunDic.Values)
                            {


                                bool flag = helper.DetermineBookOrderNewAction(cSun, helper);
                                if (flag)
                                {
                                    Thread.CurrentThread.Abort();
                                }
                            }
                        }


                        Thread.Sleep(1);



                    }
                }
                catch (ThreadAbortException)
                {

                }
                catch (Exception ex)
                {

                    if (!(ex is ThreadAbortException))
                    {

                        NetTicketCommonUtil.WriteTicketInfo("TogetherBookDetermineBookOrderThread " + ex.Message + " source:" + ex.StackTrace);
                    }
                }




            }));
            helper.TogetherBookThread.IsBackground = true;
            helper.TogetherBookThread.Priority = ThreadPriority.Highest;
            helper.TogetherBookThread.Start();

            //helper.TogetherBookThread.IsBackground = true;
            //helper.TogetherBookThread.Priority = ThreadPriority.Highest;
            ////helper.TogetherBookThread.ApartmentState = ApartmentState.STA;
            //helper.TogetherBookThread.Start();
        }
        catch (Exception ex)
        {
            if (!(ex is ThreadAbortException))
            {

                NetTicketCommonUtil.WriteTicketInfo("TogetherBookDetermineBookOrderThreadAAA:" + ex.Message + " source:" + ex.StackTrace);
            }

        }

                    每隔一毫秒就在里面判断是否有执行的任务,如果,有任务执行,并且成功,就退出线程。但是经常出现闪退。程序外面我已经加了全局捕获。但是无法捕获闪退日志。我查看windows日志,提示。
                    Framework Version: v4.0.30319

Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
at NetTicket.Actions.NetTicketHelper+<>c__DisplayClassc.b__a()
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
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()
提示空指针异常。我里面都执行都是try catch过。不明白为什么闪退。全局都是无提示的。。找了很久不知道原因

  • 写回答

2条回答 默认 最新

  • threenewbee 2017-09-03 01:41
    关注

    你用lambda表达式的?那样不太好调试,最好写成一个普通的方法作为委托给你的线程,另外变量要同步啊,我看你字典都不同步就这么调,里面有null

    评论

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)