一个关于异步调用+多线程+异常处理的问题,请高手帮忙!!! 大家帮帮我亚,走过的路过的也帮我顶顶呀!虽然可以在FormLoad方法里先throw个IndexOutOfRangeException E,让程序自己加载,但这总不是个办法啊,要是在其他线程里由有其他的程序集要加载,我怎么办呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 . 不需要你自己加载mscorlib.resources.dll,这只是你的程序运行出现异常是的提示而已。异步运行的最大问题就是需要处理好访问冲突,有可能被不同线程访问的资源需要适当的同步机制,比如Mutex之类,否则会出现一些随机的问题。 因为异常处理的特殊性,一旦出现异常用户的程序会被停止的(就象戒严),这时系统(DOT NET框架)进入异常处理机制-检查该可执行代码的异常信息表,看是否有匹配的异常处理程序,有则执行。 但只要mscorlib.resources.dll被加载过了,就不会出现这个问题。而且,按道理说这个异常应该是后台进程去处理亚,为什么整个程序会停止呢? 进入异常处理这个特殊步骤时,用户的程序是被挂起的,如果有针对该异常的用户异常处理程序,则调用这个异常处理程序,直到异常处理结束才回到用户的正常程序中。没有异常处理程序则Dotnet使用默认处理-弹一个对话框“没有处理的异常...”。 你可以将add方法的执行重新使用一个新的委托,然后异步执行委托,让这个异步执行的委托调用这个add System.Windows.Forms.Timer不是多线程的,而是直接在主线程操作这里有三种Timer的区别:http://blog.joycode.com/yaodong/articles/25845.aspx在别的线程操作窗体,必须使用Control.Invoke(someDelegate)方法否则会出现怪异情况(Windows控件不是线程安全的)Windows窗体的异常处理,看这个post:http://blog.sunmast.com/sunmast/archive/2004/12/06/1043.aspx private void button1_Click(object sender, System.EventArgs e){ this.count = 0; //timer启动一个线程 new Thread(new ThreadStart(custome_time)).Start();}private void custome_time(){ while(true) { add(this.hehe); Thread.Sleep(1000); }}see:http://dev.csdn.net/develop/article/29/29874.shtm其中第二种方法比较适合你 Sunmast(速马|Reloading...) 的资源很OK了.异常处理会中止引发异常的线程,你的timer1的线程和你form1的线程是同一个线程。http://msdn.microsoft.com/msdnmag/issues/04/02/TimersinNET/default.aspx异常发生在这里,调用这段代码的是调用add方法的线程,也就是你的timer1的线程。IAsyncResult ar = addMsgHandler.BeginInvoke(thishehe[count],addCallback,null);所以 “即显示third后WinForm窗体不能拖动”,因为"显示third后"异常发生了。既然中止了form1的线程那为什么异常后又能恢复呢?http://blog.sunmast.com/sunmast/archive/2004/12/06/1043.aspx"......未加载符号"应该指的是一些和调试相关的信息,就是一些和编译调试相关的参数了,和你出现的问题无关,如果你想获得详细的编译调试信息,可以打开相关的参数,你可以去MSDN上搜搜,那里应该有的。 其实,用其它的两种Timer我都试过,效果还是一样的,不信你们runrun代码! 我没讲清楚。你的thishehe是你form线程上的资源,出了异常,自然要中断form线程。你单独定义一个class,把你想要操作的数组放到那个class里试试. Forms.Timer 中出现的异常确实会轻微阻断Form的运行,说轻微是因为它不是真正的在单独线程内运行 这种时间上的差距可以被操作用户所忽略但是楼主所遇到的问题不是因为它引起的,应该是因为IDE环境调试的介入为了方便你开发,IDE针对进程所有使用到的资源都会调试,可能应该说是"尝试去调试"任何用户启用的线程出现问题都会被IDE截获,会提示你出现异常实际上呢,运行时用户启用的线程中未被捕获的异常都会被 "忽略"不会因为一个异常处理耗时这么多的,呵呵,不用担心至于IDE是怎么去做调试工作的,这个我也不了解:)这些东西在开发的时候就不要顾虑这么多了用Ctrl + F5 运行试试,这个不执行调试 新手求教,用C#如何对oracle数据库进行增删改查? user32.dll中findtext怎么使用 求高手指点 如何用DO-WHILE输出九九乘法表(在C#中) 为什么这个打印函数报错? 一个关于C#特性的问题,希望指教! tabControl控件 DrawMode=OwnerDrawFixed 用户自己绘制 问题 怎么去掉字符串数组 中的重复部分! WCF双工求解! 问问几个关于知识点的问题 winform中如何按一个按钮就可以打开word文档并且把它呈现在面前 问一个参数问题
异步运行的最大问题就是需要处理好访问冲突,有可能被不同线程访问的资源需要适当的同步机制,比如Mutex之类,否则会出现一些随机的问题。
因为异常处理的特殊性,一旦出现异常用户的程序会被停止的(就象戒严),这时系统(DOT NET框架)进入异常处理机制-检查该可执行代码的异常信息表,看是否有匹配的异常处理程序,有则执行。
而且,按道理说这个异常应该是后台进程去处理亚,为什么整个程序会停止呢?
这里有三种Timer的区别:
http://blog.joycode.com/yaodong/articles/25845.aspx在别的线程操作窗体,必须使用Control.Invoke(someDelegate)方法
否则会出现怪异情况(Windows控件不是线程安全的)Windows窗体的异常处理,看这个post:
http://blog.sunmast.com/sunmast/archive/2004/12/06/1043.aspx
{
this.count = 0;
//timer启动一个线程
new Thread(new ThreadStart(custome_time)).Start();
}private void custome_time()
{
while(true)
{
add(this.hehe);
Thread.Sleep(1000);
}
}see:
http://dev.csdn.net/develop/article/29/29874.shtm
其中第二种方法比较适合你
http://msdn.microsoft.com/msdnmag/issues/04/02/TimersinNET/default.aspx异常发生在这里,调用这段代码的是调用add方法的线程,也就是你的timer1的线程。
IAsyncResult ar = addMsgHandler.BeginInvoke(thishehe[count],addCallback,null);
所以 “即显示third后WinForm窗体不能拖动”,因为"显示third后"异常发生了。既然中止了form1的线程那为什么异常后又能恢复呢?
http://blog.sunmast.com/sunmast/archive/2004/12/06/1043.aspx"......未加载符号"应该指的是一些和调试相关的信息,就是一些和编译调试相关的参数了,和你出现的问题无关,如果你想获得详细的编译调试信息,可以打开相关的参数,你可以去MSDN上搜搜,那里应该有的。
你的thishehe是你form线程上的资源,出了异常,自然要中断form线程。
你单独定义一个class,把你想要操作的数组放到那个class里试试.
说轻微是因为它不是真正的在单独线程内运行
这种时间上的差距可以被操作用户所忽略但是楼主所遇到的问题不是因为它引起的,应该是因为IDE环境调试的介入
为了方便你开发,IDE针对进程所有使用到的资源都会调试,
可能应该说是"尝试去调试"
任何用户启用的线程出现问题都会被IDE截获,会提示你出现异常
实际上呢,运行时用户启用的线程中未被捕获的异常都会被 "忽略"不会因为一个异常处理耗时这么多的,呵呵,不用担心
至于IDE是怎么去做调试工作的,这个我也不了解:)
这些东西在开发的时候就不要顾虑这么多了
用Ctrl + F5 运行试试,这个不执行调试