winform控制程序值启动一次,然后在每隔一段时间自动运行 我开发了一个小工具:已经是在多线程的条件下自动调取数据库的链接,然后通过ping.exe判断这个链接是否有效!现在客户需要,程序启动后,在每隔一段时间他能够自动运行!类似于button的click again,怎么处理,跪求大师!有过次开发经验的大师,希望能给我点提示!在线等回复!谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谁自动运行,你程序不是已经运行了吗,如果定时运行程序,自己添加windows任务 需要写一段监控代码,实时监控时间,并且计算与上次执行时间之差,如果符合条件则执行,可以使用while(true){...}来实现,需要注意的是使用while这个东西时,每判断一次需要让程序睡眠一下,否则会占用相当高的CPU 比如:我的程序启动后执行load()方法,然后load完了后,假如我希望我在不关闭程序的情况下,隔10mins在load()一次!求详细 把load事件写成方法,封装起来。用time控件,每10mins之后调用。 private void form_Load(){ Action loopAction = MyMethod; loopAction.BeginInvoke(null,null);}private void MyMethod(){ while(true) { //DoSomething Thread.Sleep(100); }} 如果你需要十分钟执行一次,那么就Thread.Sleep(10*60*1000); 也可以使用timer:使用timerprivate 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 }));} 感谢7楼的人心帮助,可是:假如 dosmothing为MessageBox.Show("shifoubofangmaopian");我已经做出来了!我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!如何在dosomthing中能够ok执行timer1_Tick呢????求详细 感谢7楼的人心帮助,可是:假如 dosmothing为MessageBox.Show("shifoubofangmaopian");我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!如何在dosomthing中能够ok执行timer1_Tick呢????求详细 一下是详细代码:通过调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"); }求好心人的帮助@! TimerCallback tcb = new TimerCallback(executeRun);这个就已经是委托了!因为我当前的程序已经是在timer控制的多线程里,我想通过某个方式在timer停止后通过调用这个方法再次启动timer,重新执行这个过程!如果只是弹出一个消息框已经ok,期待再次能够在委托中启动timer的方法! 我猜想你肯定是碰到了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中去执行。就没有问题了 。 另一个版本,使用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 只要你是在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表达式” 谢谢@icefirephenix 的热心回复,那麻烦你再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html这个应该才是我真正能够表达出的意思,那里的代码是我测试写的,谢谢! 让程序不要退出,hide起来,过一段时间再执行一次即可谁说一定要按客户的,退出进程了? 那你就添加一个Timer,设置Interval为10分钟,在Timer的事件中执行load不就行了 麻烦再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html?seed=1124442357&r=78719446 感谢大家的热心回帖(一贯原则:参与就有分)!最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启动timer1的tick,也许这个委托TimerCallback在作怪,不过解决才是王道!如果须知详细,请给我留言! 如何在点击button后更新book数据库内num列的值,使每次点击后num的值减去1? visual studio2010使用问题 如何让ListView只显示纵向的网格线 Socket出了点问题 如何去除html标记? 关于页面转向的问题 研究 SharpDevelop 源码的高手请进!! 在C#的资源管理器中,把所有form统一放在一个文件夹里,类统一放在一个文件夹里,form调用class时出错 this.会弹出对话框是怎么编出来的? c#的类到底是如何调用的? app.config加密的问题 设计了一个间接递归的方法,传不出参数来,请大家帮忙看看怎么回事?
比如:我的程序启动后执行load()方法,然后load完了后,假如我希望我在不关闭程序的情况下,隔10mins在load()一次!求详细
把load事件写成方法,封装起来。用time控件,每10mins之后调用。
private void form_Load()
{
Action loopAction = MyMethod;
loopAction.BeginInvoke(null,null);
}
private void MyMethod()
{
while(true)
{
//DoSomething
Thread.Sleep(100);
}
}
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
}));
}
感谢7楼的人心帮助,可是:假如 dosmothing为MessageBox.Show("shifoubofangmaopian");我已经做出来了!
我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!如何在dosomthing中能够ok执行timer1_Tick呢????求详细
{
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");
}求好心人的帮助@!
TimerCallback tcb = new TimerCallback(executeRun);这个就已经是委托了!因为我当前的程序已经是在timer控制的多线程里,我想通过某个方式在timer停止后通过调用这个方法再次启动timer,重新执行这个过程!如果只是弹出一个消息框已经ok,期待再次能够在委托中启动timer的方法!
{
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中去执行。
就没有问题了 。
{
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
如果你看不懂()=>的话,我再把那段代码给你分解一下。 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表达式”
谢谢@icefirephenix 的热心回复,那麻烦你再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html这个应该才是我真正能够表达出的意思,那里的代码是我测试写的,谢谢!
麻烦再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html?seed=1124442357&r=78719446