如题,c#,使用事件触发机制,将数组赋给结构体,结构体存入队列,下一次触发存第二个结构体时,会将前一个元素中的数组的值给改为0,队列是c#自带的queue,本来另一个线程序会去读取,enqueue或dequeue的时候都加锁,不过将读取的线程关掉,也会出现同样的错误:
代码:
             public static Queue tlgQueue=new Queue();
           struct dateStruct
           {
              bool flag;
              byte[] tlgData;
              
           }
           //EventHandle为已经注册的事件处理函数,由别的模块触发执行
             private void EventHandle(byte[] a)
           {
              dateStruct ds=new dateStruct();
              ds.b=a;
              ds.flag=true;
              
              lock(tlgQueque)
              {
                  tlgQueque.enqueue(ds);
              } 
           }
比如第一个 byte[] 数组{1,2,3},结构体存入tlgQueque没问题,第二个byte[] 为{4,5,6},结构体放入队列的过程也没问题,但是放完后发现tlgQueque的前一个结构体的 byte[] 变成了{0,0,0}而不是先前的{1,2,3},而结构体的另一个元素flag的值不变?
不知各位大侠可否遇见过此类问题?盼复

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Collections;
    using System.Threading;struct dateStruct
    {
        public bool flag;
        public byte[] tlgData;}delegate void EventHandler(byte[] a);public partial class _Default : System.Web.UI.Page
    {
        private Queue tlgQueque = new Queue();
        private EventHandler eventFun;//= new EventHandler(EventHandle);    protected void Page_Load(object sender, EventArgs e)
        {
            eventFun = new EventHandler(EventHandle);
        }    protected void OnbtnTest_Click(object sender, EventArgs e)
        {
            byte[] arr1 = new byte[] { 1, 1, 12 };
            byte[] arr2 = new byte[] { 2, 2, 22 };
            eventFun(arr1);
            eventFun(arr2);
        }    //EventHandle为已经注册的事件处理函数,由别的模块触发执行
        public void EventHandle(byte[] a)
        {
            dateStruct ds = new dateStruct();
            ds.tlgData = a;
            ds.flag = true;        lock (tlgQueque)
            {
                tlgQueque.Enqueue(ds);
            }
        }
    }你的这个问题估计是因为多线程引发的
    我单线程运行这段代码没有什么问题
      

  2.   

    public void EventHandle(byte[] a)
    可能被释放了,或者你在它原有的方法上清空了,所以循环复制把.
      

  3.   

    楼主,可以检查一下,再第二次触发这个事件前,准备好参数 byte[] a后,是不是队列里的第一个结构体的数组已经被初始化了。
      

  4.   

    楼主,结构体出队列是怎么实现的?我用command ods = new command();
                                   ods=queue.Dequeue();
    运行的时候出错:无法将类型“object”隐式转换为“t3.Program.command”。存在一个显式转换(是否缺少强制转换?)求解啊……
    谢谢楼主啦……