我想在第二次点击时终止第一个线程,然后重新创建它。我的目标是只存在一个刻度线程。
我相信我可以通过向线程实例提供委托来实现这一目的吗?但是我用谷歌搜索并摆弄了几个小时而没有运气。任何人都可以将我的匿名lambda表达式翻译成带有委托的东西,这样我就可以在启动后识别并杀死我的线程吗?
我希望我的问题有道理,我还在学习......谢谢
Timer timer1 = new Timer();
timer1.Interval = 1000;
timer1.Start();
private void button1_Click(object sender, EventArgs e)
{
//If I click button twice, how do I kill the first tick thread,
//before creating another?
timer1.Tick += (sender2, e2) => timer1_Tick(sender2, e2, 1, "text");
}
private void timer1_Tick(object sender, EventArgs e, int num, string text)
{
//do stuff with num and text
}
答案 0 :(得分:0)
您所要做的就是创建一个变量来存储委托 - 该变量应该是Action<object, EventArgs>
类型。所以像这样:
private Action<object, EventArgs> _handler;
private void button1_Click(object sender, EventArgs e)
{
if (_handler != null)
timer1.Tick -= _handler;
_handler = (sender2, e2) => timer1_Tick(sender2, e2, 1, "text");
timer1.Tick += _handler;
}
private void timer1_Tick(object sender, EventArgs e, int num, string text)
{
timer1.Tick -= _handler;
_handler = null;
//do stuff with num and text
}
请注意,这会产生竞争条件 - &#34; _handler&#34;可以通过&#34; timer1_Tick&#34;将引用设置为null。线程在之后另一个线程设置引用,但之前它将它添加到&#34; Tick&#34;事件。 (为了避免竞争条件,你会想要创建一个&#34; _handler&#34;的本地副本。)希望这会给你这个想法......