C#中的backgroundWorker的DoWork出错时,如何让调试器断在出错点?

问题描述

我写的backgroundWorker的DoWork中代码量非常大,功能非常复杂,而且在开发阶段,极有可能会出错的以前用界面线程直接调用时没事,只是会卡死界面,但出错时会正常断在错误处,以便宜我调试,分析,解BUG现在用backgroundWorker后,出错直接就报个Complet就完了,我想分析啊,怎么办?我要调用堆栈,我要量变监控,才能解bug,这样软件怎么才能完善所以,求backgroundWorker线程中直接能出错时断下来的方法,呈现完整的可Debug的状态,放弃backgroundWorker或try或用thread这种都不是我想要的哦,我只想用backgroundWorker且要debug,项目原因复杂,无法一下解释清楚:)

解决方案

本帖最后由 sunbinjin 于 2014-12-04 19:34:39 编辑
解决方案二:
RunWorkerCompleted事件e.Error就是异常信息,你根据e.Error.Message进行分析不行么?
解决方案三:
引用1楼lovelj2012的回复:

RunWorkerCompleted事件e.Error就是异常信息,你根据e.Error.Message进行分析不行么?

不行啊,这个肯定想过,复杂的现场重现,才以知道哪些地方出问题了这点上我感觉ms应该在backgroundWorker做个开关,允许捕获异常或关闭,结果它做死了,这个类在开发时基本不能用……逼着开发时用别的多线程方式,发布时改代码到backgroundWorker?明显不符合开发规范
解决方案四:
这是开发方法论的问题,不是单纯的调试问题。开发时,你的目标应该仅仅是“眼前”,比如说1~3个小时的工作。我想你的情况更应该缩短这个时间,你每隔30分钟所开发的程序,就应该单独设计为一个单元。你应该为这些眼前的目标单元书写测试用例,然后让它们通过。前一个单元没有通过,根本没有必要去开始考虑开发下一个单元。因此一个方法即使是在BackgroundWorker运行,它都应该首先不在BackgroundWoker内被测试几十次了,你才让它将来(可能是2天以后)在下一步backgroundWorker中运行。
解决方案五:
引用2楼sunbinjin的回复:

逼着开发时用别的多线程方式,发布时改代码到backgroundWorker?明显不符合开发规范

开发的“规范”不是教条,是行动。而行动方法是know-how,一般来说没有经验的人都很难理解know-how,没有经验的人往往喜欢死记硬背规范,而不会运用规范。
解决方案六:
如果你不能保证每一个函数,每一个类都能够正常的工作,就把他们胡乱拼凑在一起,然后想要整个程序联调的时候才去解决那些隐藏的bug,是不靠谱的做法
解决方案七:
引用4楼sp1234的回复:

Quote: 引用2楼sunbinjin的回复:
逼着开发时用别的多线程方式,发布时改代码到backgroundWorker?明显不符合开发规范

开发的“规范”不是教条,是行动。而行动方法是know-how,一般来说没有经验的人都很难理解know-how,没有经验的人往往喜欢死记硬背规范,而不会运用规范。

晕,你说这些有啥用呢?难道这所有人写的代码都没bug?都是写完了就能达到release级别?我觉得你过于教条了,脱离实际了
解决方案八:
引用5楼Z65443344的回复:

如果你不能保证每一个函数,每一个类都能够正常的工作,就把他们胡乱拼凑在一起,然后想要整个程序联调的时候才去解决那些隐藏的bug,是不靠谱的做法

现场好的代码,都需要debug,你这点不能否认既然需要debug,backgroundWorker确又阻碍了debug,这就是生产环节上出问题了按你们这么说,Thread类里也不能让你debug了,一切都不让你debug了,你受得了?能debug时最好是可以debug我是debug版,需要debug,这就是意义
解决方案九:
代码量大就分成功能模块,从面向对象的角度就是放各个功能放到各种类里,复杂的选项或者配置也用类来描述每个类负责自己的功能以及异常处理在整个功能的调用(子线程)中捕获未处理的异常,出错的时候相信你不会再这么迷茫了
解决方案十:
我觉得你陷入了一个误区,认为好的代码需要DEBUG,所以任何代码都应该在真正运行起来的时候能够DEBUG其实代码不分好坏,都必须通过测试,通不过测试的代码已经不能以好坏来形容了,根本就是不能用的废品而你想所有代码都可以通过断点调试的形式去debug,这也是不现实的多线程的应用中,很多时候抛异常并不是因为某个单独的代码引起的,而是多线程本身引发的异常,即使你跟踪到出错的代码,也不是说单纯改掉这里就没有异常了,这需要你有全局的把握和分析能力而且多线程中也根本没办法断点一步一步调试
解决方案十一:
引用9楼Z65443344的回复:

我觉得你陷入了一个误区,认为好的代码需要DEBUG,所以任何代码都应该在真正运行起来的时候能够DEBUG其实代码不分好坏,都必须通过测试,通不过测试的代码已经不能以好坏来形容了,根本就是不能用的废品而你想所有代码都可以通过断点调试的形式去debug,这也是不现实的多线程的应用中,很多时候抛异常并不是因为某个单独的代码引起的,而是多线程本身引发的异常,即使你跟踪到出错的代码,也不是说单纯改掉这里就没有异常了,这需要你有全局的把握和分析能力而且多线程中也根本没办法断点一步一步调试

这个与代码好坏无关啊,这是功能需求按你这么说,Thread与backgroundWorker相近,c#的Thread起的线程,也不让你debug了,如何?我郁闷的是:明明直接给我debug就得了,为啥不给?没必要啊
解决方案十二:
多线程的代码可以debug啊,打个断点就行了,但是调试时会在主线程和这个分开来的任务里来回跳,比较麻烦,需要你自己探索调试技巧
解决方案十三:
没什么办法backgroundWorker封装的时候就已经自己加了try,catch,出错就抛异常了,而不会停在出错位置
解决方案十四:
实际上所有有一定规模的程序是必须要加上日志信息的,根据日志信息去定位错误位置和类型,以及缩小调试或分析的范围,这是一种良好的习惯,也必须要养成的习惯。
解决方案十五:
菜单调试》异常把引发那列按需要打勾

时间: 2024-09-20 10:45:14

C#中的backgroundWorker的DoWork出错时,如何让调试器断在出错点?的相关文章

ROS机器人程序设计(原书第2版)3.1.2 ROS节点启动时调用gdb调试器

3.1.2 ROS节点启动时调用gdb调试器 我们需要一个启动文件(launch)去启动节点,如下:   想要在节点启动时调用gdb调试器,需要添加launch-prefix="xterm -e gdb --args",如下:   类似地,也可以添加output="screen",使节点在终端显示.这个启动前缀会创建一个调用gdb节点的新xterm终端.依据需要设置断点,按C键或R键启动节点并调试.这在节点崩溃时,可以得到回溯(backtrace,bt).

在 Visual Studio 调试器中指定符号 (.pdb) 和源文件

查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求.   内容 查找符号 (.pdb) 文件 查找源文件   查找符号 (.pdb) 文件 说明 在之前的 Visual Studio 版本与 2012 中,调试在远程计算机上的管理的代码需要符号文件还查找了远程计算机. 现在,这已经不成问题了. 所有符号文件必须本地计算机或位于 Visual Studio 选项 对话框的 调试 / 符号 页上指定的位置. 如果调试器搜索 .pdb 文件 | 符号文件的原因需要

SQLServer中建立与服务器的连接时出错的解决方案

SQLServer中建立与服务器的连接时出错的解决方案如下: SQLServer中建立与服务器的连接时出错的解决方案如下: 步骤1:在SQLServer 实例上启用远程连接 1.指向"开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外围应用配置器" 2.在"SQL Server 2005 外围应用配置器"页, 单击"服务和连接的外围应用配置器" 3.然后单击展开&qu

asp.net中当服务器出错时显示指定的错误页面,同时把错误信息写入系统日志文件的探讨

asp.net|错误|服务器|显示|页面 asp.net中当服务器出错时显示指定的错误页面同时把错误信息写入系统日志文件的探讨 一,在Web.config中填写出错时显示的页面,可以根据不同的statusCode显示不同的出错页面.   <customErrors mode="On"  //如果设置为Off则出错只返回错误信息,不会跳到自己的指定页面defaultRedirect="/error/customerrorpage.aspx">    <

请问,在eclipse中运用glassfish服务器,测试时显示出错没如图,怎么修改?

问题描述 请问,在eclipse中运用glassfish服务器,测试时显示出错没如图,怎么修改? 在eclipse中运用glassfish服务器,测试时明明用的是glassfish3.1,但是却显示出错没有找到glassfish3.1.1,怎么修改?谢谢各位啦!

jsp中引用两个bean对象时出错 cannot be cast to

问题描述 jsp中引用两个bean对象时出错 cannot be cast to jsp页面在创建第二个bean对象时报错 <% ArrayList userlist = (ArrayList)request.getAttribute("questions"); ArrayList zjlist = (ArrayList)request.getAttribute("subzjs"); Question wen = (Question)userlist.get(

C#中的BackgroundWorker控件

Keywords: C# .NET BackgroundWorkerSource: http://txw1958.cnblogs.com/ BackgroundWorker是.NET Framework 里用来执行多线程任务的控件,它允许开发人员在一个单独的线程上执行一些操作.耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态.如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解

项目中使用System.Threading.Timer对象时IIS释放Timer对象的问题

之前的一个项目中使用System.Threading.Timer对象时有没有遇到IIS释放Timer对象的问 题.说实话之前真没遇到过这个问题,就是说我之前定义的timer对象没有释放,运行正常, 回来后我就百度寻找这方面得信息,原来IIS在运行WebApp时对于非静态资源都是自动释放, 而我回头看了看之前写的Web程序,很幸运当时是这么写的: Global.asax文件 private static Timer time; //System.Threading; private static

在 Excel 中设置当数据输入错误时提示出错信

设置了单元格的数据有效性后,当输入了无效数据后就会显示出错信息.对于出错信息的提示方法可以进行自定义设置,具体设置方法如下. (1)选中设置了数据有效性的单元格区域.单击"数据→有效性"命令,打开"数据有效性"对话框. (2)选中"出错警告"选项卡,分别在"标题"框与"错误信息"框中输入如图7-7所示的信息. (3)单击"确定"按钮回到文档中,当在选定单元格中输入小于100的数值时,弹出