杀死lambda表达式生成的事件线程

时间:2014-08-01 05:01:37

标签: c# events delegates

我想在第二次点击时终止第一个线程,然后重新创建它。我的目标是只存在一个刻度线程。

我相信我可以通过向线程实例提供委托来实现这一目的吗?但是我用谷歌搜索并摆弄了几个小时而没有运气。任何人都可以将我的匿名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
}

1 个答案:

答案 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;的本地副本。)希望这会给你这个想法......