先看代码,foreach动态创建多个timer控件,用以定时执行xxx函数
           string MySites="a|b|c";            foreach (string str in MySites.Split('|'))
            {
                System.Timers.Timer myTimerks = new System.Timers.Timer();
                myTimerks.Interval = 500;//半秒一次xxx函数
                myTimerks.Enabled = true;
                myTimerks.Elapsed += delegate
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), str);//将参数a,b,c分别传递给函数xxx
                };
                myTimerks.Start();
                Thread.Sleep(1000);//为避免太快,sleep下。注意,去掉Sleep结果将会是只剩下c。a,b被跳过,调整Sleep的值,可能会出现,a重复3次,B重复一次等各种结果。我要含有a,b,c参数的xxx函数只执行一次
            }
        //xxx函数将a,b,c字符后面依次加上1,2,3
        public void xxx(object car) {
            for (int i = 1; i < 4; i++)
            {
                Console.Write(car.ToString() + i.ToString() + "-----\r\r");
            }
        }以上代码是foreach一个字符串,然后动态创建一个timer,这个timer定时执行一个函数
如果foreach的时候不Sleep那得到的结果就是c1,c2,c3。a,b被跳过  调整foreach里的Sleep的值能得到各种莫名其妙的结果我只想含有a,b,c的xxx函数分别只执行一次,怎么办?好像是创建控件需要时间,无论怎样,怎么解决这个问题呢

解决方案 »

  1.   


      string MySites="a|b|c";            foreach (string str in MySites.Split('|'))
                {
                    System.Timers.Timer myTimerks = new System.Timers.Timer();
                    myTimerks.Interval = 1000;//半秒一次xxx函数
                    myTimerks.Enabled = true;
                    myTimerks.Elapsed += delegate
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), str);//将参数a,b,c分别传递给函数xxx
                    };
                    myTimerks.Start();
                    Thread.Sleep(3000);//为避免太快,sleep下。注意,去掉Sleep结果将会是只剩下c。a,b被跳过,调整Sleep的值,可能会出现,a重复3次,B重复一次等各种结果。我要含有a,b,c参数的xxx函数只执行一次
                    myTimerks.Close();
                }
      public  void xxx(object car)
            {
                for (int i = 1; i < 4; i++)
                {
                    Thread.Sleep(1000);
                    Console.Write(car.ToString() + i.ToString() + "-----\r\r");
                }
            }
      

  2.   

    string[] MySites="a|b|c".split(...);
    foreach(.......)
      

  3.   

    如果上面解决不了 可以尝试 for.多尝试嘛...
      

  4.   

     myTimerks.Start();
     myTimerks.Close();//直接关闭就不会有任何函数执行了这样不执行任何函数。。
      

  5.   

    \r\r打印两个换行呀
    都解释了的,foreach动态创建多个timer控件,每个timer定时执行一个函数
      

  6.   

    如果只是想输出a1,a2,a3,b1,b2,b3,c1,c2,c3,使用Timer是不合适的,它会每隔一段时间就执行一遍。foreach (string str in MySites.Split('|'))
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), str);//将参数a,b,c分别传
                    Thread.Sleep(3000);//为避免太快,sleep下。注意,去掉Sleep结果将会是只剩下c。a,b被跳过,调整Sleep的值,可能会出现,a重复3次,B重复一次等各种结果。我要含有a,b,c参数的xxx函数只执行一次
                }
      

  7.   

    你试试就知道了啊,在foreach循环中每次都会new 一个Timer对象。我让他sleep就是等他执行完啊!
    如果不关的话会不停的执行C1,c2,c3
    你拷过去我的代码运行下试试
      

  8.   

    是的,我知道你的意思。可是现在是不确定呀
    就是不知道每个timer是否执行完了,你如果Sleep时间太长是没问题,关键是我不想等
    如果参数非常多a,b,c,d,e.....就要Sleep N长时间,而且也不知道N多长,还是会异常。。
      

  9.   

    Timer是消息机制,不是线程,精度和准确性都差,定时器消息被操作系统丢弃,你的函数少调用几次有什么奇怪的,完全是意料中的,不用大惊小怪的。要求高就不要用定时器。定时器一般用在准确性和精度要求较低丢失几次消息无所谓的场合,例如显示时钟。
      

  10.   

    另外,你的程序大概是这个意思:string MySites = "a|b|c";foreach (string str in MySites.Split('|'))
    {
        System.Timers.Timer myTimerks = new System.Timers.Timer();
        myTimerks.Interval = 500;//半秒一次xxx函数
        myTimerks.Enabled = true;
        var str1 = str;
        myTimerks.Elapsed += delegate
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), str1);//将参数a,b,c分别传递给函数xxx
        };
        myTimerks.Start();
    }
      

  11.   

    不是“少调用”,是调用的时候str都是c了!
      

  12.   

    匿名方法对局部变量引用的问题,foreach的循环变量对匿名方法来说是一个全局的外部变量,解决方法是每次使用匿名方法前创建新的局部变量:
    foreach (string str in MySites.Split('|'))
                {
                    System.Timers.Timer myTimerks = new System.Timers.Timer();
                    myTimerks.Interval = 500;//半秒一次xxx函数
                    myTimerks.Enabled = true;
                   string tmp = str;
                    myTimerks.Elapsed += delegate
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), tmp);
                    };
                    myTimerks.Start();            }
      

  13.   

    做一个很小的改动,就可以达到你要的只想含有a,b,c的xxx函数分别只执行一次
    foreach (string str in MySites.Split('|'))
    {
        myTimerks = new System.Timers.Timer();
        myTimerks.Interval = 500;//半秒一次xxx函数
        myTimerks.Enabled = true;
        myTimerks.Elapsed += delegate
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(xxx), str);//将参数a,b,c分别传递给函数xxx
            myTimerks.Enabled = false;
        };
        myTimerks.Start();
        Thread.Sleep(1000);//为避免太快,sleep下。注意,去掉Sleep结果将会是只剩下c。a,b被跳过,调整Sleep的值,可能会出现,a重复3次,B重复一次等各种结果。我要含有a,b,c参数的xxx函数只执行一次
    }
      

  14.   

    在foreach进入下一个循环之前,加个myTimerks.Enabled = false;不就行了!运行完就让myTimerks停止运行!