winform控制程序值启动一次,然后在每隔一段时间自动运行

xb12369 2012-05-28 05:04:13
我开发了一个小工具:已经是在多线程的条件下自动调取数据库的链接,然后通过ping.exe判断这个链接是否有效!

现在客户需要,程序启动后,在每隔一段时间他能够自动运行!类似于button的click again,怎么处理,跪求大师!

有过次开发经验的大师,希望能给我点提示!

在线等回复!谢谢
...全文
799 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xb12369 2012-05-31
  • 打赏
  • 举报
回复
感谢大家的热心回帖(一贯原则:参与就有分)!

最后的解决办法:在用个timer2来控制timer1,通过一个变量来控制,当timer1完成一次后,改变flog的值,timer2就是通过这个blog来控制timer1,这样就解决了,我一直卡在无法自动启

动timer1的tick
,也许这个委托TimerCallback在作怪,不过解决才是王道!

如果须知详细,请给我留言!
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

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

麻烦再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html?seed=1124442357&r=78719446
wangsong145 2012-05-30
  • 打赏
  • 举报
回复
那你就添加一个Timer,设置Interval为10分钟,在Timer的事件中执行load不就行了
兔子-顾问 2012-05-30
  • 打赏
  • 举报
回复
让程序不要退出,hide起来,过一段时间再执行一次即可。。。谁说一定要按客户的,退出进程了?
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

只要你是在this.BeginInvoke(new Action(() => {/*Dosomething*/ }));Dosomething那里更新主界面或者打开窗口的话,都没有问题的,不需再调用你以前的timer了喔,要不然就会有两个timer,所表达的意思就和你的本意完全不一样了。
如果你看不懂()=>的话,我再把那段代码给你分解一下。
C# code

public void e……
[/Quote]

谢谢@icefirephenix 的热心回复,那麻烦你再看看这个:http://topic.csdn.net/u/20120530/11/996018e3-a1cf-4a06-8145-b2d89cb94046.html

这个应该才是我真正能够表达出的意思,那里的代码是我测试写的,谢谢!
花痴 2012-05-30
  • 打赏
  • 举报
回复
只要你是在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表达式”
花痴 2012-05-30
  • 打赏
  • 举报
回复
另一个版本,使用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
花痴 2012-05-30
  • 打赏
  • 举报
回复
我猜想你肯定是碰到了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();
}
#endregion

PS:tt一定要声明成全局变量,不然会被GC回收喔。
在异步线程中想要对UI线程的控件窗体做操作的话,都需要将方法委托到this.BeginInvoke()或者this.Invoke中去执行。
就没有问题了 。
xb12369 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

期待问题的解答,可以用一下委托不
[/Quote]

TimerCallback tcb = new TimerCallback(executeRun);

这个就已经是委托了!

因为我当前的程序已经是在timer控制的多线程里,我想通过某个方式在timer停止后通过调用这个方法再次启动timer,重新执行这个过程!

如果只是弹出一个消息框已经ok,期待再次能够在委托中启动timer的方法!
花痴 2012-05-29
  • 打赏
  • 举报
回复
也可以使用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
}));
}
花痴 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

C# code

private void form_Load()
{
Action loopAction = MyMethod;
loopAction.BeginInvoke(null,null);
}
private void MyMethod()
{
while(true)
{
//DoSomething
Thread.Sl……
[/Quote]
如果你需要十分钟执行一次,那么就

Thread.Sleep(10*60*1000);
花痴 2012-05-29
  • 打赏
  • 举报
回复

private void form_Load()
{
Action loopAction = MyMethod;
loopAction.BeginInvoke(null,null);
}
private void MyMethod()
{
while(true)
{
//DoSomething
Thread.Sleep(100);
}
}
xb12369 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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

能不能举个例子,或者给个参考也行啊!
study_hard_01 2012-05-29
  • 打赏
  • 举报
回复
期待问题的解答,可以用一下委托不
xb12369 2012-05-29
  • 打赏
  • 举报
回复
一下是详细代码:通过调Run()启动timer并且执行timer1_Tick_1

private 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();
}
#endregion

private void timer1_Tick_1(object sender, EventArgs e)
{
MessageBox.Show("maopian jijiang kaishi");
}



求好心人的帮助@!
xb12369 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

C# code

private void form_Load()
{
Action loopAction = MyMethod;
loopAction.BeginInvoke(null,null);
}
private void MyMethod()
{
while(true)
{
//DoSomething
Thread.Sl……
[/Quote]
感谢7楼的人心帮助,可是:

假如 dosmothing为


MessageBox.Show("shifoubofangmaopian");


我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!

PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!

如何在dosomthing中能够ok执行timer1_Tick呢????求详细

xb12369 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

C# code

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

……
[/Quote]

感谢7楼的人心帮助,可是:

假如 dosmothing为
MessageBox.Show("shifoubofangmaopian");


我已经做出来了!


我现在希望的是:这个dosomthing可以启动之前的timer,并且执行它的timer1_Tick,因为我进去不了timer1_Tick,所以程序无法在每隔一段时间自动运行!

PS:我放了一个button,然后再btnRestart_Click这里面执行,timer1_Tick成功!

如何在dosomthing中能够ok执行timer1_Tick呢????求详细
头号大宝贝 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

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


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

求详细
[/Quote]

把load事件写成方法,封装起来。用time控件,每10mins之后调用。
xb12369 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

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

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

求详细
令狐苦瓜 2012-05-28
  • 打赏
  • 举报
回复
需要写一段监控代码,实时监控时间,并且计算与上次执行时间之差,如果符合条件则执行,可以使用while(true){...}来实现,需要注意的是使用while这个东西时,每判断一次需要让程序睡眠一下,否则会占用相当高的CPU
加载更多回复(1)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧