System.Timers.Timer传参问题

baidu_21030427 2014-09-19 01:46:26
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();
}
...全文
648 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
讨论很激烈,让我看到了希望!
zhouzangood 2014-09-19
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 21 楼 baidu_21030427 的回复:
[quote=引用 20 楼 bdmh 的回复:] 你这个错跟timer有什么关系,别瞎联系
我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么[/quote] 因为它“输给你了”。
於黾 2014-09-19
  • 打赏
  • 举报
回复
你一开始放哪了?? 不是应该重新定义一个类文件来放这个类吗 你不会把这个类放到你的窗体类里面了吧
baidu_21030427 2014-09-19
  • 打赏
  • 举报
回复
引用 20 楼 bdmh 的回复:
你这个错跟timer有什么关系,别瞎联系
我把这继承timer那个类放在.designer.cs这个文件里就可以了!!这是为什么
bdmh 2014-09-19
  • 打赏
  • 举报
回复
你这个错跟timer有什么关系,别瞎联系
baidu_21030427 2014-09-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”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
baidu_21030427 2014-09-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);
            }
        }
谢谢! 非常感谢! 我先测试下
bdmh 2014-09-19
  • 打赏
  • 举报
回复

        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);
            }
        }
暈哥 2014-09-19
  • 打赏
  • 举报
回复
引用 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可以不用临时变量了。
於黾 2014-09-19
  • 打赏
  • 举报
回复
引用 12 楼 bdmh 的回复:
[quote=引用 10 楼 Z65443344 的回复:] [quote=引用 7 楼 baidu_21030427 的回复:] System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!
怎么可能,你试了吗? 有任何变量会没有tag属性的?反正暂时我是没见过.[/quote] 没有tag[/quote] 自己随手测试了一下,确实没有. 是我脑残了
baidu_21030427 2014-09-19
  • 打赏
  • 举报
回复
引用 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;
                        ...
                    };
            }
这样不行!!刚刚测试了 [/quote] 听我的,继承一个timer [/quote] 你能帮我写下简单的例子么 。。。就我上面的代码!!嘿嘿,谢谢哈
bdmh 2014-09-19
  • 打赏
  • 举报
回复
引用 11 楼 baidu_21030427 的回复:
[quote=引用 5 楼 lineages 的回复:]

for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }
这样不行!!刚刚测试了 [/quote] 听我的,继承一个timer
bdmh 2014-09-19
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
[quote=引用 7 楼 baidu_21030427 的回复:] System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!
怎么可能,你试了吗? 有任何变量会没有tag属性的?反正暂时我是没见过.[/quote] 没有tag
baidu_21030427 2014-09-19
  • 打赏
  • 举报
回复
引用 5 楼 lineages 的回复:

for (int i = 0; i < 3; i++)
            {
                new System.Timers.Timer().Elapsed += (sender, e) =>
                    {
                        var index = i;
                        ...
                    };
            }
这样不行!!刚刚测试了
於黾 2014-09-19
  • 打赏
  • 举报
回复
引用 7 楼 baidu_21030427 的回复:
System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!
怎么可能,你试了吗? 有任何变量会没有tag属性的?反正暂时我是没见过.
Forty2 2014-09-19
  • 打赏
  • 举报
回复
5楼lineages朋友的例子就是‘闭包’。例子里面有个错误,局部变量要放在闭包’外面:

for (int i = 0; i < 3; i++)
{
    var index = i;  //放在闭包’外
    new System.Timers.Timer().Elapsed += (sender, e) =>
    {
        Console.WriteLine(index);  // 使用closure
    };
 }
Forty2 2014-09-19
  • 打赏
  • 举报
回复
可以把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),不过基本原理也大致相同。
baidu_21030427 2014-09-19
  • 打赏
  • 举报
回复
引用 3 楼 happy09li 的回复:
[quote=引用 2 楼 baidu_21030427 的回复:] [quote=引用 1 楼 bdmh 的回复:] 既然有 taskTime.Interval = i * 1000; 你用Interval除1000不就是你的 i 吗
额 我这只是测试 其实这个for循环是测试用的。实际是要从数据库里取数据动态创建timer[/quote] 用tag存你的参数,在下面用[/quote] System.Timers.Timer这个定时器不是form拖进来的 没有tag属性!!!
bdmh 2014-09-19
  • 打赏
  • 举报
回复
如果方便传递参数,可以自己继承timer,写一个自己的timer类即可

        class MyTimer : System.Timers.Timer
        {
            int num;
            public int GetNum()
            {
                return num;
            }
        }
加载更多回复(5)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧