我在類別庫裡面用一個Timer去補捉一個方法的執行時間是否過長,如果過長就報錯,但是線程裡面的異常,無法拋給主程序.主程序無法補捉.有何解決方法:)大致代碼如下
class TimerState 
{   
public bool  Start = true;
public string Process ="";
public Timer tmr;
}//監視的類
static void CheckStatus(Object state)
{
TimerState s =(TimerState)state;
if(s.Start == true)
{
thrownew Exception("MPSSO"+s.Process+"查詢操作愈時"));
}
else//

try
{
s.tmr.Dispose();
s.tmr = null;
}
catch
{
}
}
}//監視方法.
TimerState s = new TimerState();
TimerCallback timerDelegate = new TimerCallback(CheckStatus);
Timer timer = new Timer(timerDelegate, s,1000, 0);
s.tmr = timer;
s.Process="小記";
//****************************
中間是要被監視的代碼//
s.Start =false;
監視完畢.
我如何才能在被監視的代碼中捕捉到監視的異常的阿.很急得阿,大家幫忙啊,多謝了
調用

解决方案 »

  1.   


    在.NET中,使用了线程池的线程,如果出现异常的话,是不会抛出来的。所以不是无法捕获,而是根本没有抛出来
      

  2.   

    自己使用static变量来处理阿,线程开始就记录开始时间,结束时记录结束时间,中间可以使用定时器去检查,如果没有结束而且超时就报错
      

  3.   

    这个并不是异常怪异,而是你的做法不对,根据《.NET框架程序设计》一书中说,线程池中抛出的异常将被线程池吃掉,我曾经写过代码来测试,确实如此,另外普通线程可以捕获到异常,不过仅限于线程本身内部,不好抛出给其他异常。
    可以看看这里对Threading.Abort方法抛出异常的讨论:http://aowind.cnblogs.com/archive/2005/05/11/153063.aspx另外也可以参考这里的讨论:http://community.csdn.net/Expert/TopicView.asp?id=4385737
      

  4.   

    jimh(Jimmy) ( ) 信誉:100  2005-11-23 12:17:00  得分: 0  
       自己使用static变量来处理阿,线程开始就记录开始时间,结束时记录结束时间,中间可以使用定时器去检查,如果没有结束而且超时就报错
    ///***********************************************
    我就是用Timer 來監測我的SQL查詢有沒有超時的啊,能給具體的代碼嗎,多謝了阿,我也用過委託和
    事件來處理了,效果還是一樣,不行的:)高手幫忙啊,很急得:(
     
      

  5.   

    难道不能在被监视的代码里加点东西吗?
    static isFail = false;
    try
    {
       //...你要被监视的代码
    }
    catch (Exception ex)
    {
       isFail = true;
    }
      

  6.   

    static bool isFail = false;
      

  7.   

    hainang1234(鼠·神·泪)
    //*************************
    ㄧ你的方法,被監視的代碼需要被執行完畢,才知道結果的啊,沒有監視的功能了,我的是要監視
    指定的代碼超時,就取消報錯的阿,謝謝你的回覆的啊:)高手呢???解決了可以再加分的啊:)
      

  8.   

    我也想过这个问题,不过没有想出办法,http://community.csdn.net/Expert/TopicView.asp?id=4385737
    这里面有位朋友提供了他的方法,说是可以,你试试看。BTW:我按我的理解试了他的方法,好像不管用,不过死马当成活马医,你自己看看吧。
      

  9.   

    楼主,你的想法太怪异了,我觉得正确的做法是这样的....首先创建一个工作线程,启动,去执行你要监视的过程然后 然后在主线程中调用这个线程对象的 Join方法,去检查过程是否结束,如果你不想让主线程阻塞,可以再启动一个监视线程,在那个监视线程中调用工作线程的Join方法 
      

  10.   

    就不能把Timer放在主线程定时检查isFail和isFinish的值?//////////////////////////////////////////////////////////////////////
    static bool isFail = false;
    static bool isFinish = false;
    try
    {
       //...你要被监视的代码
       //执行完成
       isFinaish = true;
    }
    catch (Exception ex)
    {
       isFail = true;
    }