System.Timers.Timer传参问题

时间:2022-08-21 20:37:48
RT  我现在一个功能 动态创建多个System.Timers.Timer 

for (int i = 1; i <= 3; i++)
            {
                System.Timers.Timer taskTime = new System.Timers.Timer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.Enabled = true;
                taskTime.AutoReset = true;

                taskTime.Elapsed += new ElapsedEventHandler(taskTime_Elapsed);
            }



void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
           //我这里想获取到上面传过来的参数
            System.Timers.Timer t = (System.Timers.Timer)sender;
            t.Enabled = false;
            t.Close();
        }

25 个解决方案

#1


本帖最后由 bdmh 于 2014-09-19 13:50:12 编辑
既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

#2


引用 1 楼 bdmh 的回复:
既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer

#3


引用 2 楼 baidu_21030427 的回复:
Quote: 引用 1 楼 bdmh 的回复:

既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer


用tag存你的参数,在下面用

#4


你不如用多线程做
就算创建了多个timer,其实还是都在主线程里啊,这样做有任何意义?

#5



for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }

#6


如果方便传递参数,可以自己继承timer,写一个自己的timer类即可

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
        }

#7


引用 3 楼 happy09li 的回复:
Quote: 引用 2 楼 baidu_21030427 的回复:

Quote: 引用 1 楼 bdmh 的回复:

既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer


用tag存你的参数,在下面用


System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

#8


可以把taskTime_Elapsed放到一个放状态的类中:

class Worker
{
    public Worker(int i)
    {
        this.i = i;
    }

    int i;
    public void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //我这里想获取到上面传过来的参数
        Console.WriteLine(i);
        System.Timers.Timer t = (System.Timers.Timer)sender;
        t.Enabled = false;
        t.Close();
    }
}

for (int i = 1; i <= 3; i++)
{
  taskTime.Elapsed += new Worker(i).taskTime_Elapsed;
}


当然也可以用C#的闭包 (Closure),不过基本原理也大致相同。

#9


5楼lineages朋友的例子就是‘闭包’。例子里面有个错误,局部变量要放在闭包’外面:
 

for (int i = 0; i < 3; i++)
{
    var index = i;  //放在闭包’外
    new System.Timers.Timer().Elapsed += (sender, e) =>
    {
        Console.WriteLine(index);  // 使用closure
    };
 }

 

#10


引用 7 楼 baidu_21030427 的回复:
System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

#11


引用 5 楼 lineages 的回复:

for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  

#12


引用 10 楼 Z65443344 的回复:
Quote: 引用 7 楼 baidu_21030427 的回复:

System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

没有tag

#13


引用 11 楼 baidu_21030427 的回复:
Quote: 引用 5 楼 lineages 的回复:


for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  


听我的,继承一个timer

#14


引用 13 楼 bdmh 的回复:
Quote: 引用 11 楼 baidu_21030427 的回复:

Quote: 引用 5 楼 lineages 的回复:


for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  


听我的,继承一个timer

你能帮我写下简单的例子么 。。。就我上面的代码!!嘿嘿,谢谢哈

#15


引用 12 楼 bdmh 的回复:
Quote: 引用 10 楼 Z65443344 的回复:

Quote: 引用 7 楼 baidu_21030427 的回复:

System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

没有tag

自己随手测试了一下,确实没有.
是我脑残了

#16


引用 9 楼 Forty2 的回复:
5楼lineages朋友的例子就是‘闭包’。例子里面有个错误,局部变量要放在闭包’外面:
 

for (int i = 0; i < 3; i++)
{
    var index = i;  //放在闭包’外
    new System.Timers.Timer().Elapsed += (sender, e) =>
    {
        Console.WriteLine(index);  // 使用closure
    };
 }

 


谢谢提醒,但是4.5可以不用临时变量了。

#17



        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }

#18


引用 17 楼 bdmh 的回复:

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }

谢谢! 非常感谢! 我先测试下

#19


引用 17 楼 bdmh 的回复:

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }


加了这个代码报错啊

未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“GAKeyAnalysis.FrmCPGrabByIndeed.resources”正确嵌入或链接到程序集“GAKeyAnalysis”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。  

#20


你这个错跟timer有什么关系,别瞎联系

#21


引用 20 楼 bdmh 的回复:
你这个错跟timer有什么关系,别瞎联系


我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么

#22


你一开始放哪了??
不是应该重新定义一个类文件来放这个类吗
你不会把这个类放到你的窗体类里面了吧

#23


引用 21 楼 baidu_21030427 的回复:
Quote: 引用 20 楼 bdmh 的回复:

你这个错跟timer有什么关系,别瞎联系


我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么


因为它“输给你了”。

#24


System.Timers.Timer传参问题

#25


System.Timers.Timer传参问题讨论很激烈,让我看到了希望!

#1


本帖最后由 bdmh 于 2014-09-19 13:50:12 编辑
既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

#2


引用 1 楼 bdmh 的回复:
既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer

#3


引用 2 楼 baidu_21030427 的回复:
Quote: 引用 1 楼 bdmh 的回复:

既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer


用tag存你的参数,在下面用

#4


你不如用多线程做
就算创建了多个timer,其实还是都在主线程里啊,这样做有任何意义?

#5



for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }

#6


如果方便传递参数,可以自己继承timer,写一个自己的timer类即可

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
        }

#7


引用 3 楼 happy09li 的回复:
Quote: 引用 2 楼 baidu_21030427 的回复:

Quote: 引用 1 楼 bdmh 的回复:

既然有 taskTime.Interval = i * 1000;
你用Interval除1000不就是你的 i 吗

额  我这只是测试  其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer


用tag存你的参数,在下面用


System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

#8


可以把taskTime_Elapsed放到一个放状态的类中:

class Worker
{
    public Worker(int i)
    {
        this.i = i;
    }

    int i;
    public void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //我这里想获取到上面传过来的参数
        Console.WriteLine(i);
        System.Timers.Timer t = (System.Timers.Timer)sender;
        t.Enabled = false;
        t.Close();
    }
}

for (int i = 1; i <= 3; i++)
{
  taskTime.Elapsed += new Worker(i).taskTime_Elapsed;
}


当然也可以用C#的闭包 (Closure),不过基本原理也大致相同。

#9


5楼lineages朋友的例子就是‘闭包’。例子里面有个错误,局部变量要放在闭包’外面:
 

for (int i = 0; i < 3; i++)
{
    var index = i;  //放在闭包’外
    new System.Timers.Timer().Elapsed += (sender, e) =>
    {
        Console.WriteLine(index);  // 使用closure
    };
 }

 

#10


引用 7 楼 baidu_21030427 的回复:
System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

#11


引用 5 楼 lineages 的回复:

for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  

#12


引用 10 楼 Z65443344 的回复:
Quote: 引用 7 楼 baidu_21030427 的回复:

System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

没有tag

#13


引用 11 楼 baidu_21030427 的回复:
Quote: 引用 5 楼 lineages 的回复:


for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  


听我的,继承一个timer

#14


引用 13 楼 bdmh 的回复:
Quote: 引用 11 楼 baidu_21030427 的回复:

Quote: 引用 5 楼 lineages 的回复:


for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }


这样不行!!刚刚测试了  


听我的,继承一个timer

你能帮我写下简单的例子么 。。。就我上面的代码!!嘿嘿,谢谢哈

#15


引用 12 楼 bdmh 的回复:
Quote: 引用 10 楼 Z65443344 的回复:

Quote: 引用 7 楼 baidu_21030427 的回复:

System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!

怎么可能,你试了吗?
有任何变量会没有tag属性的?反正暂时我是没见过.

没有tag

自己随手测试了一下,确实没有.
是我脑残了

#16


引用 9 楼 Forty2 的回复:
5楼lineages朋友的例子就是‘闭包’。例子里面有个错误,局部变量要放在闭包’外面:
 

for (int i = 0; i < 3; i++)
{
    var index = i;  //放在闭包’外
    new System.Timers.Timer().Elapsed += (sender, e) =>
    {
        Console.WriteLine(index);  // 使用closure
    };
 }

 


谢谢提醒,但是4.5可以不用临时变量了。

#17



        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }

#18


引用 17 楼 bdmh 的回复:

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }

谢谢! 非常感谢! 我先测试下

#19


引用 17 楼 bdmh 的回复:

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
            public void SetNum(int value)
            {
                num = value;
            }
        }
        void taskTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            MyTimer t = (MyTimer)sender;
            t.Enabled = false;
            t.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //string id = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
            //var y = Assembly.Load(id);
            for (int i = 1; i <= 3; i++)
            {
                MyTimer taskTime = new MyTimer();
                //我这里想把i传到taskTime_Elapsed里  然后方法里使用!因为是多个,全局参数不能用
                taskTime.Interval = i * 1000;
                taskTime.SetNum(i);
                taskTime.Enabled = true;
                taskTime.AutoReset = true;
 
                taskTime.Elapsed += new System.Timers.ElapsedEventHandler(taskTime_Elapsed);
            }
        }


加了这个代码报错啊

未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“GAKeyAnalysis.FrmCPGrabByIndeed.resources”正确嵌入或链接到程序集“GAKeyAnalysis”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。  

#20


你这个错跟timer有什么关系,别瞎联系

#21


引用 20 楼 bdmh 的回复:
你这个错跟timer有什么关系,别瞎联系


我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么

#22


你一开始放哪了??
不是应该重新定义一个类文件来放这个类吗
你不会把这个类放到你的窗体类里面了吧

#23


引用 21 楼 baidu_21030427 的回复:
Quote: 引用 20 楼 bdmh 的回复:

你这个错跟timer有什么关系,别瞎联系


我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么


因为它“输给你了”。

#24


System.Timers.Timer传参问题

#25


System.Timers.Timer传参问题讨论很激烈,让我看到了希望!