在winForm中起了一个System.Threading.Timer的定时器,在定时器中做一些判断,若不满足条件则整个应用程序退出,在这个过程中Winform还可以任意启动其他的画面,下面是程序:
private void Form1_Load(object sender, System.EventArgs e)
{
.....
TimerCallback timerDelegate = new TimerCallback(CheckStatus);
System.Threading.Timer thead_timer = new System.Threading.Timer(timerDelegate, null, 1000, 0);
}private void CheckStatus(Object myObject)
{
   try
   {
      if ( !condition)
      {
MessageBox.Show("xxxxxx");
         Application.Exit();
       }
    }
    catch(Exception ex)
    {
MessageBox.Show(ex.ToString());
         Application.Exit();
     }
}
但是,CheckStatus方法弹出出错信息后,完全可以不点击该信息,这样也就没法控制程序的退出了。这里应该是多线程的问题,请问如何解决。谢谢

解决方案 »

  1.   

    (一).描述
       此示例演示怎样设置线程的状态(中止,暂停,挂起等)
    (二).代码
       using System;
    using System.Threading;namespace 管理线程_使线程中止_暂停_挂起等_

     //委托声明(函数签名)
     delegate string MyMethodDelegate();
     class MyClass
     {  
      public static void Method1()
      {
       //thread1.Abort();一句中的 Abort会引发异常System.Threading.ThreadAbortException,其异常作用,下面会讲解   
       try
       {
        int i;
        for(i=0;i<10;i++)
        {
         Console.WriteLine("Method1 at :" + i.ToString());  
         DelayTime(1);  //延长时间(模拟执行任务)
        }
       }
       catch(System.Threading.ThreadAbortException)
       {
        //注意一点,线程跳出此语句块后才终止。
        //这里可以写释放此进程占用的资源代码,或者其它一些操作,比如: 在进程结束前将重要数据写回数据库中
        Console.WriteLine("进程1马上将被强制杀死!"); 
        Thread.ResetAbort();  //取消Abort()操作,我在这里加这句没用,反而出现异常了,读者如果知道,请告诉我怎样写才对   
       }
      }
      public static void Method2()
      {
       int i;
       for(i=0;i<10;i++)
       {
        Console.WriteLine("Method2 at :" + i.ToString());  
        DelayTime(1);  //延长时间,模拟执行任务
       }
      }
      
      private static void DelayTime(int n)
      {
       DateTime startTime = DateTime.Now;
       while(startTime.AddSeconds(n) > DateTime.Now)
       {
        //延长时间,模拟实际中的进程
       }
      }  [STAThread]
      static void Main(string[] args)
      {              
       Thread thread1 = new Thread(new ThreadStart(Method1));   
       Thread thread2 = new Thread(new ThreadStart(Method2));   
       thread1.Start();
       thread2.Start();
       thread1.Abort(); //将线程强制终止(杀死)   
                
       //thread1.Join的作用是无限制等待thread1终止后,才执行下面的语句,起到与主线程同步的作用.
       //原因是: thread1最终是被终止的,但是thread1一个独立的线程,它并不会马上被终止。
       //什么时候用:就拿这里来举例吧,当thread1占用着一个资源,当thread1终止后,
       //thread2线程马上也要用此资源,这就要求等待thread1彻底终止并释放后占用资源后,才能接着执行下一句,
       //否则线程thread2会找不到此资源,甚至会发生异常错误! 为了安全起见,一般是要在Abort()方法后面紧跟一个Join()方法的.
       
       
                //thread1.Suspend();//此方法将线程无限制时间的挂起,相当于无限制时间的暂停线程
                //thread1.Resume(); //将正在挂起的进程继续执行
       
       //Thread.Sleep(1000);//暂停线程1秒钟,以毫秒为单位暂停.
       
       //Thread.ResetAbort();     //取消Abort()操作
       //thread1.Interrupt(); //中止线程现在处的状态。如果线程由运行转到休眠,执行此句后,会使线程重新返回到运行状态
                
       Console.Read();
      }
     }
    }本示例代码已经测试,能够正常运行!
    (三).示例下载
      http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar
      

  2.   

    /// <summary>
    /// 杀死进程 
    /// </summary>
    public static void Method()
    {
    Process[] procs = Process.GetProcessesByName(System.Reflection.Assembly.GetExecutingAssembly().FullName.Split(',')[0]); 
    try 

    foreach (Process proc in procs) 

    if (!(proc.CloseMainWindow())) 
    proc.Kill(); 


    catch{}
    }
      

  3.   

    int i=0;
    private void aabbcc()
    {
    while(true)
    {
    i++;
    if(100000==i)
    {
    Application.ExitThread();
    Application.Exit();
    break;
    }

    }
    }
    private void button6_Click(object sender, System.EventArgs e)
    {
    System.Threading.Thread tread= new System.Threading.Thread(new System.Threading.ThreadStart(aabbcc));
    tread.Start();
                       }从线程中直接退出.
      

  4.   

    请问,如何能取得当前活动的窗体对象?这样可以在指定对象的前面显示具有指定文本的消息框。[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String) As DialogResult
    [C#] public static DialogResult Show(IWin32Window, string);
      

  5.   

    在winForm中起了一个System.Threading.Timer的定时器,在定时器中做一些判断,若不满足条件则整个应用程序退出你的条件有哪些?直接放在一个Form里判断可以吗??不满足条件的,就Application.Exit()就好了.
    form.showDiaolog就可以了.[STAThread]
    static void Main() 
    {
    ContidionForm f5  = new ContidionForm ();
    f5.ShowDialog();
    if(f5.DialogResult == DialogResult.OK)
    {
    f5.Close();
    Application.Run(new mainForm());
    }
    }
      

  6.   

    判断的时间太长,大概要10几秒,因为要去访问一个WebService
      

  7.   

    /// <summary>
    /// 记录用户本次操作系统的用时。
    /// </summary>
    public void UseTimeSpan()
    {
    System.Threading.TimerCallback OutTimerCallback = new TimerCallback(this.WriteDB);
    OutTimer = new System.Threading.Timer(OutTimerCallback,null,0,10000);
    }
    private void WriteDB(object sender)
    {
    if(this.count>0)
    Quit.Method();
    else
    {
    count++;
    try{
    yewuyuan.WebService4(int.Parse((DateTime.Now-BeginTime).TotalMinutes.ToString().Split('.')[0]));
    }
    catch{}
    finally
    {
    Quit.Method();
    }
    }
    }
      

  8.   

    能否取得当前的活动窗体,这样我在主窗体Form1中调用MessageBox.show时,可以指定当前活动窗体,这样message就在最前面,用户必须点击该信息,然后退出程序
      

  9.   

    能否取得当前的活动窗体,这样我在主窗体Form1中调用MessageBox.show时,可以指定当前活动窗体,这样message就在最前面,用户必须点击该信息,然后退出程序
    你的窗体是随便调的吗??
    还是mdi窗体??如果是的话,,
    mdiForm.ActiveMdiChild应该可以取到当前活动的窗体.
      

  10.   

    如果不是,你可以记录当前的活动窗体,在Form的.Activated事件中.this.Activated += new EventHandler(Form1_Activated);private void Form1_Activated(object sender, EventArgs e)
    {
    //记录当前窗体.
    int i=0;
    }