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过。不明白为什么闪退。全局都是无提示的。。找了很久不知道原因

1

2个回答

不行哦,我这里捕获不了异常关键,要是知道异常就好了,程序直接闪退了。。

0
end_sun
end_sun 回复caozhy: 同样的问题,我也不想问两遍,我按错了。。囧想搞个悬赏的。。我改了,也无法调试。直接跑到windows日志里面去了
接近 2 年之前 回复
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 lambda表达式不方便调试,让你先改过来自然就能调试了。你非但不听还直接点踩,真是醉了。另外同一个问题不要反复提问,否则问题删除,c币没收。
接近 2 年之前 回复

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

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 实现全局异常捕获
       在实际的项目开发中,我们往往会遇到自己编写的程序在自己电脑上运行正常,但是安装在其他电脑上就会出现闪退等异常现象,由于不是每台电脑都安装有VS的运行环境,所以不能在线调试,因此就不能快速的找到程序的bugnn。那么,我们是不是可以设置一个全局异常捕获,当然可以!nn只需要在Program这个类中加入以下代码:nnn static void Main()n {n ...
C# 多线程之捕获异常(try...catch)
当主程序启动时,定义了两个将会抛出异常的线程。其中一个在方法内部对异常进行了处理,另一个则没有。可以看到第二个异常没有被包裹启动线程的try/catch代码块捕获到。所以如果直接使用线程,一般来说不要在线程中抛出异常,而是在线程内部代码中使用try/catch代码块!nnnusing System;nnusing System.Threading;nnnnnamespace 异常处理nn{nn...
Winform 主程序入口中记录并捕获全局异常
在做一些应用中,根据实际的需求情况,网上也收了些资料。这个对查找程序中的bug及出现的一些问题能很好排查,找到问题原因!
一个基于C#实现的完美解决在多线程中异常处理的程序代码
完美解决在多线程中异常处理的程序代码,本例子提供料SafeThread_UnsafeThread例子,值得推荐给大家。
C#程序崩溃问题处理
崩溃问题软件在测试力度加大情况下,可能导致的内存不足及崩溃的问题可能快速暴露,针对这些问题可以通过下面方式解决,欢迎补充。1. 常用方式:A)类文件中占用内存较大的全局变量,公共变量,类私有变量及类的实例用完之后手动设置为null或Dispose(),对局部变量不需要置null,但局部的实例需要Dispose或置null。B)占用内存较大的变量或实例,在循环创建这些类或实例的地方适当进行置null...
C# winform捕获全局异常
在program.cs里面添加nnn /// &lt;summary&gt;n /// 应用程序的主入口点。n /// &lt;/summary&gt;n [STAThread]n static void Main()n {nn tryn {n //处理未...
android使用UncaughtExceptionHandler捕获全局异常(闪退)
CrashHandler:nnnnpackage itant.com.cashtest;nnimport android.util.Log;nn/**n * Created by zhanzc on 2017/7/27.n */nnpublic class CrashHandler implements Thread.UncaughtExceptionHandler {nn @Overrid
如何防止后台线程抛出的异常让程序崩溃退出
如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救?如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出。但是,如果是后台线程抛出了异常呢?并没有 Dispatcher 可以用。所以我们就束手就擒让程序自己退出吗?WPF 和
在try catch中开启新的线程,不能捕获线程里面的异常
近期在review代码的时候发现,有些人为了图方便,直接在代码引用的最外层放上一个try catch,以为可以捕获一切异常,降低崩溃率。rn事实上,如果try的是新开启的一个线程,那么这个线程里面出现的异常是catch不到。也就是说在A线程中new B线程,B线程中出现的crash跟A线程无关,A也catch不到。rnrnpublic class TheadExceptionTest {rnrn publi...
C#MessageBox.show无法弹出,造成程序卡死
#原创文章,未经许可不转载nC#MessageBox.show无法弹出,造成程序卡死n气死,我以为MessageBox就直接show就好了,就可以提示用户了,但是,被自己坑死,由于线程问题,中间插入MessageBox引起之前线程无法完成,又产生MessageBox线程,调试时一直奇怪,请教同时后,按ALT键唤醒了Messagebox。本仙女就是一个刚毕业的小朋友。所有也不懂原理,哪里有错误的理解...
捕捉C#全局异常的事件处理
对于初学者,C#应用程序可能会遇到一些导致软件宕机的似是而非的异常。有的异常普通处理不太好分析,这里就需要用到全局异常捕捉。下面是以输出的形式来查看异常,也可以通过log4net输出到文件中查看分析。nnnn       [STAThread]n        static void Main()n        {n            tryn            {
程序崩溃自动重启以及将未捕获到的异常写退出栈
1. 程序崩溃后,让它能自动重启,继续运行。 2. 对崩溃的程序,在退出前,自动在控制台上输出其退出堆栈详情,以便调试。(适合自动测试程序)
C#(winform)新建项目后,调试异常终止且无错误提示问题解决办法
该问题分为两个异常环节,具体现象:在调试模式下,代码执行到某些地方后会直接退出调试模式(例如:执行OracleDataReader语句时 ),且没任何错误提示。当解决了该问题后有出现另一个问题,例如:代码执行到LOAD事件的OracleDataReader语句时,前台页面会直接弹出,但是LOAD事件代码并不会全部执行完。由于该问题没有报错或者错误提示,所以查找了一些资料,也和一些同事进行了沟通,最
Android开发之全局异常捕获完美闪退
Android开发之全局异常捕获完美闪退rnrnrnrnrnrnrnrn一、Application的生命周期rnrn在说如何完美退出APP之前,我们先来讲讲Application的生命周期.rnrn1、onCreate,app启动的主入口,程序启动的时候调用rnrnrnrn[java] viewrn plain copyrnrnrnrnrnrnrn@Override  rnpublic void 
C#winform 全局错误捕捉 可以让错误跳过去继续执行住程序
C#winform 全局错误捕捉 可以让错误跳过去继续执行住程序
C#Winform窗体工具类(三)窗体全程异常捕捉
在开发中,有一些常常用到的方法,每次查找以前写的比较麻烦 ,自己写有在做重复工作 ,所以总一个小的工具类,随时添加内容3.winform窗体全程异常捕捉  静态类 FormTools( public static class FormTools) /// &amp;lt;summary&amp;gt;n /// 异常处理方法n /// &amp;lt;/summary&amp;gt;n ...
C#多线程编程笔记(5.5)-处理异步操作中的异常
近来在学习Eugene Agafonov编写的《C#多线程编程实战》(译),做些笔记也顺便分享一下^-^本篇将描述在C#中使用异步函数时如何处理异常。我们将学习对多个并行的异步操作使用await时如何聚合异常。using System;nusing System.Threading.Tasks;nnnamespace 处理异步操作中的异常n{n class Programn {n ...
C# 捕捉未被Try Catch捕获的异常
Winform程序中,有try…catch…进行异常捕获,但还是存在异常关闭的情况,在程序中捕获这些异常,会大大方便问题的定位分析与程序优化。nn两个异常事件nnApplication.ThreadException在发生应用程序UI主线程中未捕获线程异常时发生,触发的事件;nAppDomain.CurrentDomain.UnhandledException当后台线程中某个异常未被捕获时触发;...
C#解决运行窗口闪退
Console.ReadKey();//解决闪退rnusing System;rnusing System.Collections.Generic;rnusing System.Linq;rnusing System.Text;rnusing System.Threading.Tasks;rnrnnamespace ConsoleApplication1rn{rn class Program
C# WinForm 捕获未处理的异常
C# WinForm 捕获未处理的异常
捕获程序Crash,让你的APP告别闪退
为什么出现这种方法当APP在线程中跑出了异常就会导致APP crash。比如我们最常见的NullPointerException空指针异常。有些时候我们不希望这种异常导致我们的APP crash,尤其是在debug状态下,程序很大的时候
捕获程序异常退出的代码
MSJExceptionHandler类,很好用的一个Windows 程序异常破获类,只需要添加至工程里一起编译一下就可以,不需要另外写代码。 结合PDB文件可以定位至出错的代码行,内附Visual studio 结合PDB文件调试DMP的方法。
C# 调用 C++ 写的Dll 遇到的问题(调用DLL 自动退出)
1 回调函数正确调用一次之后,程序自动n在回调函数前面加     [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 进行修饰n如下所示:nn  [UnmanagedFunctionPointer(CallingConvention.Cdecl)] npublic delegate void RecivecallBack(IntPtr
使用UncaughtExceptionHandler捕获运行时异常
前面我们知道Exceptions分为可检查异常(checked exceptions)和运行时异常(runtime exception)。具体参照文章Java异常处理手册和最佳实践,对于可检查异常,我们必须对它进行处理,要么捕获要么在方法上使用throws抛给调用者;运行时异常很大可能是因为程序员造成的,它往往是可以避免的,它是无法预测的,所以不需要进行捕获,也不需要在方法上添加throws关键字来
非托管异常处理方法……
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace supervise{    class Program    {        /// &amp;lt;summary&amp;gt;        ///         ...
WPF解决因未捕获异常导致软件崩溃堆栈
在App中增加构造函数并设置UnhandledException代理函数npublic App()n{n var currentDomain = AppDomain.CurrentDomain;n currentDomain.UnhandledException += CurrentDomain_UnhandledException;n }n nprivate voi...
多线程情况下如何捕获线程中的异常?
多线程情况下如何捕获线程中的异常?摘要: 本文主要介绍当使用ExecutorService来执行任务(Runnable)时,该如何正确的捕捉线程中的异常。nThread类最佳实践: n写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。
C++11多线程异常
一旦开始了线程,需要显示决定要等待线程函数完成或分离它自行完成。如果detach()线程不等待,你要确保通过线程访问的数据是有效的,直至该线程完成为止,例如线程函数持有局部变量的指针或引用,且当主函数退出的时候线程未完成,就会出错,线程函数就会访问一个已被销毁的变量,解决方法是数据私有化。join()背后的含义有两层,一是等待子线程执行完毕,避免主线程先完成,从而导致子线程终止,二是join()会
Andorid 引用.so库导致的崩溃问题解决办法
使用第三方SDK的时候,经常会有.so库。使用时一个重要问题是:主项目和引用库项目中lib的目录结构必须保持一致,即库项目中含有arm64-v8a目录,住工程和其他库工程也必须含有arm64-v8a目录,且里面必须有相应的.so文件。n可以在build文件里面使用:nnndk {n abiFilters "armeabi", "armeabi-v7a","x86"n};n方式指定加载
捕获程序弹出的异常窗口,不让程序弹出异常窗口
rnvoid __cdecl _my_invalid_parameter_handler(const wchar_t * expression, const wchar_t * function, const wchar_t * file, unsigned int line, uintptr_t)rn{rn  wchar_t tips[256]={0};rn  wprintf_s(tips,
java捕获线程异常
在jdk1.5之前,线程不允许抛出异常(各个线程要把自己的checkedn exception处理掉),但是无法避免的是uncheckedexception,也就是RuntimeException,当抛出异常时子线程会结束,但不会影响主线程。主线程通过tryn catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.Unca
C# winform程序界面假死但是资源管理器显示Running,界面无法关闭的可能性
C# winform程序界面假死但是资源管理器显示Running,界面无法关闭的可能性1. 应用程序运行一段时间会出现界面假死现象2. 其他线程在Log记录中可以确认还在正常工作3.界面主线程没有更新数据和控件更新4.还会有什么可能会导致界面假死,请各位指教?线程卡死和CPU 耗尽,应该都是这种现象,请指教?感谢...
解决winform编程中使用线程界面卡死的案例
解决winform编程中使用线程界面卡死的案例 用了委托
Windows程序闪退Windows日志捕获Kernelbase模块错误
nn解决方案(3种方案,可以逐一尝试):nn1、编译从Any CPU变更为X64或X86nn2、64位计算机编译X86版本,在客户计算机运行时选择兼容性,以管理员权限运行nn3、检查配置文件,所有读取的Configuration节点是否在App.Setting 或Web.Confirg文件中存在。(绝大部分原因再次,好好检车节点,出现此问题,可能只是极少部分计算机出现此问题,笔者此问题发生在Win...
.net4.0调用非托管DLL的异常捕获
由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出。rn托管程序使用通常的捕获try……catch块不起作用。原因是.NET 4.0里新的异常处理机制引起。rn在4.0以前,因为SEH异常被转换成了跟普通.NET异常相同的异常,这样程序员只要用catch ( Exception e)的模式就可以捕捉到所有的异常。这样处理的问题是,由于SEH异常通常都不
关于C#try catch异常捕获语句一点需要注意的地方
在调用某函数时,如果使用了try catch语句捕获该函数产生的异常,而如果这个函数内调用了其它函数,其它函数又掉了另外的函数,如果这些被调用的函数中任意一个抛出了异常,而异常所在的代码块没有异常捕获的操作,于是这个异常会被最外层的try catch语句捕获,而此时产生的异常已经远远超出了你最开始的预期,当它输出了你指定的错误提示后,你回来查找错误却发现难以找到该异常是哪段代码抛出的。比如以下代码
多线程操作UI控件——DataGridView假死现象
在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便。  今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的
Winform程序安装后打开出现程序停止运行问题解决方法
Winform程序安装后打开出现程序停止运行问题解决方法
Qt使用QString中arg导致程序闪退
最近项目外面反馈程序出现闪退问题,根据一步步调试,发现在记录日志中导致,之前代码只从其他地方拷贝修改部分地方没注意. 报错代码:QString strLog=QString(&quot;[超标留样],留样瓶号为%1&quot;).arg(strLog).arg(m_pCYQ-&amp;gt;GetBottleNum());原本定义为:QString strLog=QString::fromUtf8(&quot;超标留样&quot;);strLo...
C#调用C++的dll,PInvoke问题和回调函数抛出异常access violation
不磨叽,直接上代码。rnC++动态库中函数定义rnrn#ifndef _AUDIOSYSSDK_Hn#define _AUDIOSYSSDK_Hnnntypedef void PlayResFunc(void *powner,int filestate, int playlen);nnnextern "C"n{n n int _stdcall Audio_OpenChannel(char *p
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链导致显卡价格 java异常学习