C#中timer的使用?

尘封 2011-08-10 03:21:54
问题说明,我需要定时的做一个UDP广播,假设为一秒。现在我使用了System.Threading.Thread.Timer来帮组我打到这个效果,具体代码如下:
public CheckOnline()
{
InitializeComponent();
TimerCallback delegate_CheckOnline = new TimerCallback(CheckOnline.CheckOnlineStatus);
System.Threading.Timer timer = new System.Threading.Timer(delegate_CheckOnline, null, 0, 1000);
// Thread.Sleep(Timeout.Infinite);
}
public static void CheckOnlineStatus(object s)
{
// 发送广播信号,通报自己存在;
IPEndPoint lan = new IPEndPoint(IPAddress.Parse("192.168.2.255"), 9000);
// IPEndPoint localEP_Send=new IPEndPoint(IPAddress.Parse("192.168.2.250"),0);
UdpClient Client = new UdpClient();
byte[] hello = Encoding.ASCII.GetBytes("hello");
Client.Send(hello, hello.Length,lan);
}

CheckOnline()是我主窗体的构造函数。我遇到的问题是当运行该程序时窗体可以正常显示,当时Timer只会执行两次就不再执行,即我只检测到它发了两次UDP广播包。而我将主线程永久睡眠时可以让timer正常执行,即每个一秒发送一个UDP广播报。我的需求就是既要让主窗体正常显示又要让timer正常执行。请问有没有什么好方法达到我的目的?最好不要用互斥或信号量等。
...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
isjoe 2011-08-10
  • 打赏
  • 举报
回复
System.Windows.Form.Timer 是不能重入的,也就是说你1秒的间隔未必是精确的。
尘封 2011-08-10
  • 打赏
  • 举报
回复
我找到答案了,我不能使用System.Threading.Thread.timer,而应该使用System.Windows.Form.Timer,这样就不会才生上述的情况。第一种timer会与主线程争夺时间,导致只能一者执行;而后一种timer可以与Form一起执行,其本身就会Form的组件。
M_juaner 2011-08-10
  • 打赏
  • 举报
回复
帮顶!

110,524

社区成员

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

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

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