线程的一个入门级问题 A线程执行过程需要10秒钟;主线程里每隔3秒钟时间调用一次A线程,如果A线程已经在执行,就结束掉重新执行类似于js里面的setTimeout和clearTimeout不知道怎么实现。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在主界面用Timer控件,每3秒检查一次不行么?结束线程有二种方式:一种是直接调用线程的Abort()函数;再一种给子线程设共用指示变量,子线程循环检查指示变量的值,主线程控制指示变量的值。这二种方式是我用过的,不知道有没有别的方式。 首先感谢回复。因为在学习thread,所以不会用其他方法来做;我使用Abort方法,尽管Thread.IsAlive==false了,但是那个线程执行的方法却仍然在继续执行Thread showcoolThread = new Thread(new ThreadStart(() => { try { lblCool.Visible = true; string sss = lblMark.Text;//lblMark是用于记录一个状态值的 SetTimeout(4000, () => { lblCool.Text = sss; }); } catch { MessageBox.Show("ex"); } }));Action showCool = () => { try { if (showcoolThread.IsAlive) { showcoolThread.Abort(); } //MessageBox.Show(showcoolThread.IsAlive ? "alive" : "dead"); //确实dead了,但是之前的延时操作并没有终止 showcoolThread = new Thread(new ThreadStart(() => { try { lblCool.Visible = true; string sss = lblMark.Text; SetTimeout(4000, () => { lblCool.Text = sss; }); } catch { MessageBox.Show("ex"); } })); showcoolThread.Start(); } catch(Exception ex) { MessageBox.Show(ex.Message); } }; 我把疑惑的地方剥出来,好看些public void changelbl() { SetTimeout(4000, () => { label1.Text = ""; }); }Thread showcoolThread;private void button1_Click(object sender, EventArgs e) { showcoolThread = new Thread(new ThreadStart(changelbl)); showcoolThread.Start(); } private void button2_Click(object sender, EventArgs e) { showcoolThread.Abort(); showcoolThread.Join(); }//延时操作public static void SetTimeout(double interval, Action action) { System.Timers.Timer timer = new System.Timers.Timer(interval); timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) { timer.Enabled = false; action(); }; timer.Enabled = true; }点击按钮1,执行4秒后更新label,4秒内点击按钮2强行终止线程没有效果,一会儿label还是更新了 这个问题和线程没有关系...你虽然终止了线程但那个Timer既没有disabled也没有dispose,它还在运行... System.Timers.Timer是非托管资源,必须主动销毁...你这代码已经有内存泄漏了... 嗯,那天晚上我就找的这个原因。就是这个SetTimeOut方法用的Timer导致的 LZ以前是学C++的?我以前学的是VB,看你的代码看得满头包…… 2个错误.第一个:SetTimeout(4000, () => { label1.Text = ""; });线程间访问控件用代理才行.第二个,System.Timers.Timer 是基于另外的线程,和你自己定义的线程运行没有任何关系.你在新开线程里做的操作,只是把一个代理加到Timer的事件里面,所以自己定义线程关闭并不会影响那个action的执行.正确的写法: delegate void Change(); public void changelbl() { while (true) { Thread.Sleep(4000); { Change change = delegate() { label1.Text = ""; }; this.Invoke(change); //Console.WriteLine("ge"); } break; } //SetTimeout(4000, () => { Console.WriteLine("Gf"); }); } private void button2_Click_1(object sender, EventArgs e) { showcoolThread.Abort(); //showcoolThread.Join(); } 当然对于你这种需要重复执行的方法,不推荐多次打开和关闭线程来控制,因为开关线程是很消耗系统资源的.你可以在关闭的方法里面,比button2_Click_1设置一个变量,更改这个变量的值,当线程里面时间到了以后马上要执行Change change = delegate() { label1.Text = ""; }; this.Invoke(change);之前 判断下这个变量的值. c# FastReport 具有相同值的单元格合并问题 请高手解释一下为什么是这个结果? 江湖救急!一个比较简单的题目但我忘了怎么写了,请大家帮忙! DataGrid绑定更新后数据时跳过更新行的问题,请指教 求正则表达式提取url的问题! 现在做C#的程序员,工资水平怎么样? 关于Acess数据库记录备份并显示消息队列的问题请各位大虾帮帮忙谢谢!!!(急急急) 新的MVP名单出来了 再开一版,求BUTTON的KEYPRESS,KEYDOWN事件,当方向键时 Remoting服务端隔一段时间就接受不了数据 C# 界面淡入淡出效果如何实现 C# win form 窗体
结束线程有二种方式:一种是直接调用线程的Abort()函数;再一种给子线程设共用指示变量,子线程循环检查指示变量的值,主线程控制指示变量的值。
这二种方式是我用过的,不知道有没有别的方式。
因为在学习thread,所以不会用其他方法来做;
我使用Abort方法,尽管Thread.IsAlive==false了,但是那个线程执行的方法却仍然在继续执行Thread showcoolThread = new Thread(new ThreadStart(() => {
try
{
lblCool.Visible = true;
string sss = lblMark.Text;//lblMark是用于记录一个状态值的
SetTimeout(4000, () => { lblCool.Text = sss; });
}
catch { MessageBox.Show("ex"); }
}));Action showCool = () =>
{
try
{
if (showcoolThread.IsAlive)
{
showcoolThread.Abort();
}
//MessageBox.Show(showcoolThread.IsAlive ? "alive" : "dead");
//确实dead了,但是之前的延时操作并没有终止
showcoolThread = new Thread(new ThreadStart(() =>
{
try
{
lblCool.Visible = true;
string sss = lblMark.Text;
SetTimeout(4000, () => { lblCool.Text = sss; });
}
catch { MessageBox.Show("ex"); }
}));
showcoolThread.Start();
}
catch(Exception ex) { MessageBox.Show(ex.Message); }
};
public void changelbl()
{
SetTimeout(4000, () => { label1.Text = ""; });
}Thread showcoolThread;
private void button1_Click(object sender, EventArgs e)
{
showcoolThread = new Thread(new ThreadStart(changelbl));
showcoolThread.Start();
} private void button2_Click(object sender, EventArgs e)
{
showcoolThread.Abort();
showcoolThread.Join();
}//延时操作
public static void SetTimeout(double interval, Action action)
{
System.Timers.Timer timer = new System.Timers.Timer(interval);
timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
action();
};
timer.Enabled = true;
}点击按钮1,执行4秒后更新label,4秒内点击按钮2强行终止线程没有效果,一会儿label还是更新了
我以前学的是VB,看你的代码看得满头包……
第一个:SetTimeout(4000, () => { label1.Text = ""; });
线程间访问控件用代理才行.
第二个,System.Timers.Timer 是基于另外的线程,和你自己定义的线程运行没有任何关系.
你在新开线程里做的操作,只是把一个代理加到Timer的事件里面,所以自己定义线程关闭并不会影响那个action的执行.
正确的写法: delegate void Change();
public void changelbl()
{
while (true)
{
Thread.Sleep(4000);
{
Change change = delegate()
{
label1.Text = "";
};
this.Invoke(change);
//Console.WriteLine("ge");
}
break;
}
//SetTimeout(4000, () => { Console.WriteLine("Gf"); });
}
private void button2_Click_1(object sender, EventArgs e)
{
showcoolThread.Abort();
//showcoolThread.Join(); }
你可以在关闭的方法里面,比button2_Click_1设置一个变量,更改这个变量的值,当线程里面时间到了以后马上要执行
Change change = delegate()
{
label1.Text = "";
};
this.Invoke(change);
之前 判断下这个变量的值.