C#求解timer控件知识
大家好,,经过一晚上的奋斗,和,start()和stop()的方法好奇怪,我stop后,再也启动不了,最后参照msdn上timer的用法,我也终于解决了下我自己贴子的问题,
http://bbs.csdn.net/topics/390368476
我的解决方法是::
public void hexing_name_select()
{
hexing_line hexing = new hexing_line();
for (int i = 0; i < hexing.hexing_name.Count(); i++)
{
hexing_date.Rows.Add();
hexing_date.Rows[i].Cells[0].Value = hexing.hexing_name[i];
hexing_date.Rows[i].Cells[1].Value = hexing.hexing_ip[i];
}
}
public void hexing_ping(object obj)
{
int i = Convert.ToInt32(obj);
Ping pp = new Ping();
PingReply ppResult = pp.Send(Convert.ToString(hexing_date.Rows[i].Cells[1].Value), 10);
hexing_date.Rows[i].Cells[2].Value = ppResult.RoundtripTime.ToString();
hexing_date.Rows[i].Cells[3].Value = ppResult.Status.ToString();
hexing_date.Rows[i].Cells[4].Value = z;
}
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
public void hexing_click_select(object source, EventArgs e)
{
//myTimer.Stop();我尝试了下,这个stop不stop都不会影响到ping的时候会卡界面的情况。
z+=1;
if (z < 10)
{
hexing_thread();
myTimer.Enabled = true;////是不是这一句起到了作用?求解
}
else
{
myTimer.Enabled = false;
}
}
public void hexing_thread()
{
int line_count = hexing_date.RowCount;
Thread[] line_PING = new Thread[line_count];
for (int a = 0; a < line_count; a++)
{
line_PING[a] = new Thread(new ParameterizedThreadStart(hexing_ping));
line_PING[a].Start(a);
}
}
private void hexing_check_Click(object sender, EventArgs e)
{
hexing_date.Rows.Clear();
hexing_name_select();
myTimer.Tick += new EventHandler(hexing_click_select);
myTimer.Interval = 1000;
myTimer.Start();
}
现在我测试出来的就不会出现界面卡现象,,我有两个问题我想不明白,想问问大家,
①:我这种方法可行么?因为我觉得这个timer也好像是没隔1s就创建了很多线程一样,myTimer.Stop();这句代码没有效果,个人感觉:我现在这个代码的流程和我以前做的那个流程差不多。但是为啥效果会不一样。。
②我测试了下,好像就是这句代码给的效果static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();但是我不懂,这句代码和我从控件界面直接拉下来的timer控件有什么不同的么。。。
[解决办法]
myTimer.Enabled = false; 就等于调用了 myTimer.Stop()。两个语句有一个就够了,可惜你保留了一个不恰当的语句,注释掉一个恰当的语句。
同样地,设置 myTimerEnable = true 就等于调用了 myTimer.Start()。
你执行了10次异步注册线程,然后就调用Stop。就算你不让“重复任务垃圾”堆积这么多次,又何必让它堆积2~9次呢?打个比方,你每隔7个小时就给国务院写一封内容相同的建议书,明知道人家处理流程需要3天,你却仍然坚持每隔几个小时就寄出去一封,干什么?
最后,为什么10次以后就再也不ping了?难道你要放一个人去不断地用手指点击 hexing_check 按钮?因此这就是业务逻辑错误了,你保留了一个不恰当的语句,原因是你的业务逻辑都改成错误的了!
你应该在一进入hexing_click_select时立刻关闭定时器,然后当所有的 hexing_ping 异步调用均完毕(最后一个之行结束)时才将定时器启动。
[解决办法]
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
最好不要加上static,这样所有窗体实例共享一个timer。
去掉static,这代码和你从设计器拖动过来的是一样的。
[解决办法]
参考
http://blog.csdn.net/supegg/article/details/6460649
[解决办法]
http://blog.csdn.net/catchdream/article/details/8524182
有些关于timer的分析,希望对你有用
[解决办法]
+1