Timer是不是设置了时间?如果设置了时间的话,比如设置的为5秒,那你点击之后五秒才会触发

解决方案 »

  1.   

    把Timer的间隔时间设成1秒,它也比一秒停留的时间长,甚至比十秒还多。
      

  2.   

    还有,所谓不能立刻运行这个按钮的click事件,你是怎么测试它不能运行的
      

  3.   

    我发现在IE中是这样,但是在360浏览器中,虽然也会延迟一点,但是延迟也就1秒。在IE中甚至有时延时20多秒,有什么解决办法么?
      

  4.   

    按钮是前台按钮,按钮事件是后台。我把停止按钮的事件设了断点,当我停止按钮的时候,页面还在滚动,等了一会才调到设的断点的地方。
    我觉得你没有理解我的意思
    所谓前台按钮,后台按钮,是问你这个按钮控件到底是前台控件还是后台控件,而不是这个按钮显示在前台页面还是后台脚本里(后台脚本里放按钮谁看得见啊)
    根据你说的,事件是个后台事件,那么我判断你的按钮应该是个后台控件(ASP:BUTTON)
    那么你的timer又在哪里,是JS里定义的timer,还是工具箱里拖出来的timer?
    既然用了timer,页面上是否用了AJAX?
    我觉得你应该用前台控件,写JS脚本来控制timer,既然已经用了AJAX,就不要再使用后台事件了,后台事件必须导致页面回发,跟AJAX冲突
      

  5.   

    按钮是前台按钮,按钮事件是后台。我把停止按钮的事件设了断点,当我停止按钮的时候,页面还在滚动,等了一会才调到设的断点的地方。
    我觉得你没有理解我的意思
    所谓前台按钮,后台按钮,是问你这个按钮控件到底是前台控件还是后台控件,而不是这个按钮显示在前台页面还是后台脚本里(后台脚本里放按钮谁看得见啊)
    根据你说的,事件是个后台事件,那么我判断你的按钮应该是个后台控件(ASP:BUTTON)
    那么你的timer又在哪里,是JS里定义的timer,还是工具箱里拖出来的timer?
    既然用了timer,页面上是否用了AJAX?
    我觉得你应该用前台控件,写JS脚本来控制timer,既然已经用了AJAX,就不要再使用后台事件了,后台事件必须导致页面回发,跟AJAX冲突
    应该问是脚本按钮还是asp.net服务器按钮
      

  6.   


          //timer定时动作,每间隔xxxx毫秒触发一次
            private void timer1_Tick(object sender, EventArgs e)
            {
                label1.Left -=3; //设置label1左边缘与其容器的工作区左边缘之间的距离
                if (label1.Right < 0) //当label1右边缘与其容器的工作区左边缘之间的距离小于0时
                {
                    label1.Left = this.Width; //设置label1左边缘与其容器的工作区左边缘之间的距离为该窗体的宽度
                }
            }
            //开始滚动
            private void button1_Click(object sender, EventArgs e)
            {
                timer1.Enabled = true; //开始滚动
                button2.Enabled = true;
                
            }
            //单击暂停按钮
            private void button2_Click(object sender, EventArgs e)
            {
                timer1.Enabled = false; //停止滚动
                button2.Enabled = false;
            }
      

  7.   

    //开始滚动
     protected void BtStart_Click(object sender, EventArgs e)
        {
                Timer2.Enabled = true;
                Timer3.Enabled = true;
                Thread f = new Thread(MessQueue.Receive);
                 f.Start();
            }
     protected void Timer2_Tick(object sender, EventArgs e)
        {    
            Timer2.Enabled = false; 
               StartLinsterToGetWeightA();
            Timer2.Enabled = true;
        }protected void Timer3_Tick(object sender, EventArgs e)
        {
               Timer3.Enabled = false;
               StartLinsterToGetWeightB();
                Timer3.Enabled = true;
            }
            
        }public void StartLinsterToGetWeightA()
        {
            float weight;
            bool flag = true;
            ArrayList List = new ArrayList();
    //随机产生0-5的数字,当第一个数为0时,不存入list中;不为0,存入list;直到再产生0,把第一个产生的不为零的数作为重量。
            while (flag)
            {
                Random random = new Random();
                weight = random.Next(0, 5);
                if (weight != 0)
                {
                    List.Add(weight);
                }
                else
                {
                    int count = List.Count;
                    if (count != 0)
                    {
                        weight += (float)List[0];
                        dtm = messqueue.AddWeightData(weight, 1, Dbucket_kind.SelectedValue.ToString(), DWareHouse_NO.SelectedValue.ToString(), Dhouse_no.SelectedValue.ToString(), Dbank_no.SelectedValue.ToString(), Dlevel_no.SelectedValue.ToString()).Copy();  这里先把数据添加到消息队列,然后再返回一个表。                    if (dt.Rows.Count == 10)   //固定只显示最新的十条记录
                        {
                            dt.Rows.RemoveAt(0);
                        }
                        dt.Merge(dtm);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                        List.Clear();
                        flag = false;
                    }
                }
            }
        }public void StartLinsterToGetWeightB()
        {
            bool flag = true;
            ArrayList List = new ArrayList();
            while (flag)
            {
                Random random = new Random();
                float weight = random.Next(0, 5);
                if (weight != 0)
                {
                    List.Add(weight);
                }
                else
                {
                    int count = List.Count;
                    if (count != 0)
                    {
                        weight += (float)List[0];
                        dtm = messqueue.AddWeightData(weight, 2, Dbucket_kind.SelectedValue.ToString(), DWareHouse_NO.SelectedValue.ToString(), Dhouse_no.SelectedValue.ToString(), Dbank_no.SelectedValue.ToString(), Dlevel_no.SelectedValue.ToString()).Copy();
                        if (dt.Rows.Count == 10)
                        {
                            dt.Rows.RemoveAt(0);
                        }
                        dt.Merge(dtm);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                        List.Clear();
                        flag = false;
                    }
                }
            }
    }//滚动停止
      protected void BtStop_Click(object sender, EventArgs e)
        {
           
            Timer3.Enabled = false;
            Timer2.Enabled = false;
             
           //将这次的统计结果显示在页面上
            OracleConnection conn = new OracleConnection("Data Source=wms;User ID=wms;Password=wms;");
            conn.Open();
            DateTime dti = DateTime.Now;
            string WorkDay = string.Format("{0:yyyyMMdd}", dti);
            string sql1 = "select sum(getmitem_weight) from TResult where work_day=" + WorkDay + "";
            string sql2 = "select count(*) from TResult where work_day=" + WorkDay + "";
            OracleCommand cmm1 = new OracleCommand(sql1, conn);
            OracleCommand cmm2 = new OracleCommand(sql2, conn);
            string Stweight = cmm1.ExecuteScalar().ToString();
            if (Stweight == "")
            {
                Stweight = "0";
            }
            float weight = float.Parse(Stweight);
            string Stcount = cmm2.ExecuteScalar().ToString();
            if (Stcount == "")
            {
                Stcount = "0";
            }
            int count = Convert.ToInt32(Stcount);
            Label11.Text = weight.ToString();
            Label23.Text = count.ToString();
            conn.Close();
            conn.Dispose();
        }
      

  8.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。
      

  9.   

    晕死!
    你在timer里执行了死循环,导致页面假死了
    只有死循环退出了,才能响应你的click
      

  10.   

    既然已经使用了timer,为什么还要使用while??
      

  11.   


    没有死循环public void StartLinsterToGetWeightA()
        {
            float weight;
            bool flag = true;
            ArrayList List = new ArrayList();
    //随机产生0-5的数字,当第一个数为0时,不存入list中;不为0,存入list;直到再产生0,把第一个产生的不为零的数作为重量。
            while (flag)
            {
                Random random = new Random();
                weight = random.Next(0, 5);
                if (weight != 0)
                {
                    List.Add(weight);
                }
                else
                {
                    int count = List.Count;
                    if (count != 0)
                    {
                        weight += (float)List[0];
                        dtm = messqueue.AddWeightData(weight, 1, Dbucket_kind.SelectedValue.ToString(), DWareHouse_NO.SelectedValue.ToString(), Dhouse_no.SelectedValue.ToString(), Dbank_no.SelectedValue.ToString(), Dlevel_no.SelectedValue.ToString()).Copy();  这里先把数据添加到消息队列,然后再返回一个表。
     
                        if (dt.Rows.Count == 10)   //固定只显示最新的十条记录
                        {
                            dt.Rows.RemoveAt(0);
                        }
                        dt.Merge(dtm);
                        GridView1.DataSource = dt;
                        GridView1.DataBind();
                        List.Clear();
                        flag = false;   //这里有停止,我的目的是:随机产生0-5的数字,当第一个数为0时,不存入list中;不为0,存入list;直到再产生0,把第一个产生的不为零的数作为重量,这个时候循环就停止了。
                    }
                }
            }
        }
      

  12.   

    而且你有2个timer,里面都是这种不确定次数的循环
      

  13.   

    时间越短,等待的时间就越长,可能是因为等待时间越短,每个任务就可以越快执行完,那么例如:80 个任务中就有越多的任务可以用到前面任务执行完后释放掉的线程,也就有越多的任务不必去线程池申请新的线程避免多等待半秒钟的申请时间,而Timer 并不会去关心线程池申请前80 个任务的时间长短,只要它没有执行到timer.Dispose(),它就会每隔10 毫秒激发一次响应时间,不管前80 次任务执行时间是长还是短,timer 都在第80 次任务才执行Dispose,执行Dispose 后timer 就不会激发新的事件了,但是如果前80 次任务申请的时间越长,那么timer 就会在前80 次任务申请的时间内激发越多响应事件, 那么线程池中等待队列中就会有越多的响应函数等待申请线程,System.Threading.Timer 没有机制取消线程池等待队列中多余的申请数,所以导致等待时间越长,80 次后执行的任务数越多。
      

  14.   

    按钮事件应该是立即触发的,只不过timer停止了,其上一次已经触发的事件仍会执行,这便会造成没有即时停止的错觉
      

  15.   


    不是,滚动我是在页面上有一个gridview,把要滚动的记录放在datatable里面,在把gridview的数据源设为datatable。
      

  16.   


    80个肯定不会出现这种问题的,线程的初始化主要是分配堆栈空间要点时间,启动线程是系统自动调度的
    曾经做过模拟1000个webservice客户端,循环调用webservice的测试
    用线程池和线程并没有发现任何明显区别,更没发现用线程性能就快了(注意我是先用循环初始化好了1000个Thread),然后再次循环启动的,也没发现快了)
    用的就是普通的双核PC机
      

  17.   


    不是,滚动我是在页面上有一个gridview,把要滚动的记录放在datatable里面,在把gridview的数据源设为datatable。Thread f = new Thread(MessQueue.Receive);那你这个线程是用来干嘛的~
      

  18.   

    我这个把重量去读过来之后,可以在StartLinsterToGetWeightA()方法中看到调用messqueue.AddWeightData(....),messqueue.AddWeightData(....)把数据存到消息队列中。Thread f = new Thread(MessQueue.Receive);用来从消息队列中取数据,存到数据库和csv文件。
      

  19.   


    不是,滚动我是在页面上有一个gridview,把要滚动的记录放在datatable里面,在把gridview的数据源设为datatable。Thread f = new Thread(MessQueue.Receive);那你这个线程是用来干嘛的~我这个把重量去读过来之后,可以在StartLinsterToGetWeightA()方法中看到调用messqueue.AddWeightData(....),messqueue.AddWeightData(....)把数据存到消息队列中。Thread f = new Thread(MessQueue.Receive);用来从消息队列中取数据,存到数据库和csv文件。
      

  20.   

    80个肯定不会出现这种问题的,线程的初始化主要是分配堆栈空间要点时间,启动线程是系统自动调度的
    曾经做过模拟1000个webservice客户端,循环调用webservice的测试
    用线程池和线程并没有发现任何明显区别,更没发现用线程性能就快了(注意我是先用循环初始化好了1000个Thread),然后再次循环启动的,也没发现快了)
    用的就是普通的双核PC机但是,在执行timer_tick的时候把timer.enable=false了。他只能再接到Timer.Enabled = true;才会间隔多少时间后再执行timer_tick。
      

  21.   

    还有BS模式,什么是前台代码,什么是后台代码,各种控件的用法,AJAX,JS这些,都应该先了解了解
    不要老拿单机的思路去做BS
      

  22.   

    BS架构中,IE是如何和服务端交互的,这个最应该先了解清楚
    它绝对不是单机程序中窗口和代码的关系
      

  23.   

    因为你整个思路都是基于winform的前台窗口,后台代码的机制
    而不是BS架构中客户端/服务端的机制
    根本没有考虑到客户端和服务端需要通信,通信又是怎样的过程,这个问题
      

  24.   

    你总以为,页面中的按钮就跟winform中的按钮一样,采用事件驱动,点一下就应该执行事件函数
    虽然asp.net封装的很傻瓜,让你平时应用起来感觉和winform没什么区别一样
    但是你不真正了解这个机制,而滥用winform里的代码,就会引发意想不到的问题
      

  25.   

    微软为了让web开发跟winform开发感觉上差不多,后台做了大量的工作
    但是绝不是web开发就跟winform开发一样了
    它毕竟还是不一样
      

  26.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。很抱歉我也没看懂。只是觉得好蛋疼。能问一下timer的interval 被你设成了多少毫秒吗?如果是我在写这段代码,我看到这么不确定的滚动,我会把这个interval 设成60*1000ms甚至更大,然后在1分钟内单步调试看结果。还有一个问题,多线程读写队列,要么用锁,要么用同步队列,否则总会出错的。
      

  27.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。很抱歉我也没看懂。只是觉得好蛋疼。能问一下timer的interval 被你设成了多少毫秒吗?如果是我在写这段代码,我看到这么不确定的滚动,我会把这个interval 设成60*1000ms甚至更大,然后在1分钟内单步调试看结果。还有一个问题,多线程读写队列,要么用锁,要么用同步队列,否则总会出错的。
    在BS中使用多线程,本身就是很蛋疼的一件事
      

  28.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。很抱歉我也没看懂。只是觉得好蛋疼。能问一下timer的interval 被你设成了多少毫秒吗?如果是我在写这段代码,我看到这么不确定的滚动,我会把这个interval 设成60*1000ms甚至更大,然后在1分钟内单步调试看结果。还有一个问题,多线程读写队列,要么用锁,要么用同步队列,否则总会出错的。我知道哪里错了,在代码里面有一个让线程停止1秒的代码,把那删了就可以了。也不知道为什么删了就可以了。看你们说的我的代码是不是问题很多呢?我那滚动的那些数据是在模拟从称重仪读取出来的数据。
      

  29.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。很抱歉我也没看懂。只是觉得好蛋疼。能问一下timer的interval 被你设成了多少毫秒吗?如果是我在写这段代码,我看到这么不确定的滚动,我会把这个interval 设成60*1000ms甚至更大,然后在1分钟内单步调试看结果。还有一个问题,多线程读写队列,要么用锁,要么用同步队列,否则总会出错的。我知道哪里错了,在代码里面有一个让线程停止1秒的代码,把那删了就可以了。也不知道为什么删了就可以了。看你们说的我的代码是不是问题很多呢?我那滚动的那些数据是在模拟从称重仪读取出来的数据。能否回答下这个问题:timer的interval 被你设成了多少毫秒?
      

  30.   


    请你帮我看看我这个,我这个是两台称重仪,timer负责接收数据,并滚动显示在页面上。很抱歉我也没看懂。只是觉得好蛋疼。能问一下timer的interval 被你设成了多少毫秒吗?如果是我在写这段代码,我看到这么不确定的滚动,我会把这个interval 设成60*1000ms甚至更大,然后在1分钟内单步调试看结果。还有一个问题,多线程读写队列,要么用锁,要么用同步队列,否则总会出错的。我知道哪里错了,在代码里面有一个让线程停止1秒的代码,把那删了就可以了。也不知道为什么删了就可以了。看你们说的我的代码是不是问题很多呢?我那滚动的那些数据是在模拟从称重仪读取出来的数据。能否回答下这个问题:timer的interval 被你设成了多少毫秒?2000毫秒
      

  31.   


    2000毫秒2000ms,前台后台交互的通信消耗+视觉滞留,差不多了吧~
    没删sleep(1000)那行代码前,就不一定了。。你可以试试不断调整timer的interval 值,从500,1000,2000,5000,测试一下~
      

  32.   


    2000毫秒2000ms,前台后台交互的通信消耗+视觉滞留,差不多了吧~
    没删sleep(1000)那行代码前,就不一定了。。你可以试试不断调整timer的interval 值,从500,1000,2000,5000,测试一下~
    我测试了一下,不断地调整timer的interval 值,随着间隔的增大,滚动的速度也在减慢。这个间隔时间的长短没有影响到停止暂停的缓慢。