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

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

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!