我开发了一个小工具:已经是在多线程的条件下自动调取数据库的链接,然后通过ping.exe判断这个链接是否有效!现在客户需要,程序启动后,在每隔一段时间他能够自动运行!类似于button的click again,怎么处理,跪求大师!有过次开发经验的大师,希望能给我点提示!在线等回复!谢谢

解决方案 »

  1.   

    谁自动运行,你程序不是已经运行了吗,如果定时运行程序,自己添加windows任务
      

  2.   

    需要写一段监控代码,实时监控时间,并且计算与上次执行时间之差,如果符合条件则执行,可以使用while(true){...}来实现,需要注意的是使用while这个东西时,每判断一次需要让程序睡眠一下,否则会占用相当高的CPU
      

  3.   


    比如:我的程序启动后执行load()方法,然后load完了后,假如我希望我在不关闭程序的情况下,隔10mins在load()一次!求详细
      

  4.   


    把load事件写成方法,封装起来。用time控件,每10mins之后调用。
      

  5.   


    private void form_Load()
    {
        Action loopAction = MyMethod;
        loopAction.BeginInvoke(null,null);
    }
    private void MyMethod()
    {
        while(true)
        {
            //DoSomething
            Thread.Sleep(100);
        }
    }
      

  6.   

    如果你需要十分钟执行一次,那么就Thread.Sleep(10*60*1000);
      

  7.   

    也可以使用timer:使用timer
    private System.Threading.Timer _timer = null;//这个要使用个全局变量,代码不好看
    private void StartMyWork()
    {
        _timer = new Timer(MyMethod, null, 0, 100);
    }
    private void MyMethod(object obj)
    {
         /*DoSomething*/
       //如果在timer里面需要更新UI控件的话,由于这个timer不是在主线程中执行的因此要这样访问:
       this.Dispatcher.BeginInvoke(
           new Action(
           () =>
           {
               //这样更新UI
           }));
    }
      

  8.   


    感谢7楼的人心帮助,可是:假如 dosmothing为MessageBox.Show("shifoubofangmaopian");我已经做出来了!
    我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!如何在dosomthing中能够ok执行timer1_Tick呢????求详细
      

  9.   

    感谢7楼的人心帮助,可是:假如 dosmothing为MessageBox.Show("shifoubofangmaopian");我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!如何在dosomthing中能够ok执行timer1_Tick呢????求详细
      

  10.   

    一下是详细代码:通过调Run()启动timer并且执行timer1_Tick_1private void Form1_Load(object sender, EventArgs e)
            {
                Run();
            }#region 每隔一段特定的时间执行一次:程序启动后在每隔10秒之后再次执行
            public void Run()
            {
                TimerCallback tcb = new TimerCallback(executeRun);            //Timer在5秒中后(DueTime)开始执行,之后每隔10秒(Period)执行一次
                System.Threading.Timer tt = new System.Threading.Timer(tcb, null, 5000, 10000);        }
            public void executeRun(object obj)
            {
                //MessageBox.Show("maopian yijing bofang le" + DateTime.Now.ToString());
                timer1.Start();
            }
            #endregionprivate void timer1_Tick_1(object sender, EventArgs e)
            {
                MessageBox.Show("maopian jijiang kaishi");
            }求好心人的帮助@!
      

  11.   


     TimerCallback tcb = new TimerCallback(executeRun);这个就已经是委托了!因为我当前的程序已经是在timer控制的多线程里,我想通过某个方式在timer停止后通过调用这个方法再次启动timer,重新执行这个过程!如果只是弹出一个消息框已经ok,期待再次能够在委托中启动timer的方法!
      

  12.   

    我猜想你肯定是碰到了MessageBox.Show("maopian jijiang kaishi");在异步线程中会出异常的问题。给你个完整的吧        private void Form1_Load(object sender, EventArgs e)
            {
                Run();
            }        #region 每隔一段特定的时间执行一次:程序启动后在每隔10秒之后再次执行        private System.Threading.Timer tt = null;
            public void Run()
            {
                if (tt == null)
                {
                    tt = new System.Threading.Timer(executeRun, null, 5000, 10000);
                }        }
            public void executeRun(object obj)
            {
                this.BeginInvoke(new Action(() => { MessageBox.Show("maopian yijing bofang le" + DateTime.Now.ToString()); }));
                //timer1.Start();
            }
            #endregionPS:tt一定要声明成全局变量,不然会被GC回收喔。
    在异步线程中想要对UI线程的控件窗体做操作的话,都需要将方法委托到this.BeginInvoke()或者this.Invoke中去执行。
    就没有问题了 。
      

  13.   

    另一个版本,使用while...Sleep的方式        private void Form1_Load(object sender, EventArgs e)
            {
                Action action = Run;
                action.BeginInvoke(null, null);
            }        #region 每隔一段特定的时间执行一次:程序启动后在每隔10秒之后再次执行
            public void Run()
            {
                while (true)
                {
                    executeRun();
                    Thread.Sleep(1000);
                }        }
            public void executeRun()
            {
                this.BeginInvoke(new Action(() => { MessageBox.Show("maopian yijing bofang le" + DateTime.Now.ToString()); }));
            }
            #endregion
      

  14.   

    只要你是在this.BeginInvoke(new Action(() => {/*Dosomething*/ }));Dosomething那里更新主界面或者打开窗口的话,都没有问题的,不需再调用你以前的timer了喔,要不然就会有两个timer,所表达的意思就和你的本意完全不一样了。
    如果你看不懂()=>的话,我再把那段代码给你分解一下。 public void executeRun()
            {
                Action showInfoAction = ShowInfo;//Action是一个.net自己的委托,就是一个void、无参形式的委托
                this.BeginInvoke(showInfoAction);
            }        private void ShowInfo()
            {
                MessageBox.Show("maopian yijing bofang le" + DateTime.Now.ToString());
            }
    PS:()=>{};是lambda表达式。你可以把它看成一个匿名的方法,()中表示入参,{}是代码。更多资料请Google
    “.net lambda表达式”
      

  15.   


    谢谢@icefirephenix  的热心回复,那麻烦你再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html这个应该才是我真正能够表达出的意思,那里的代码是我测试写的,谢谢!
      

  16.   

    让程序不要退出,hide起来,过一段时间再执行一次即可谁说一定要按客户的,退出进程了?
      

  17.   

    那你就添加一个Timer,设置Interval为10分钟,在Timer的事件中执行load不就行了
      

  18.   


    麻烦再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html?seed=1124442357&r=78719446
      

  19.   

    感谢大家的热心回帖(一贯原则:参与就有分)!最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启动timer1的tick,也许这个委托TimerCallback在作怪,不过解决才是王道!如果须知详细,请给我留言!