如题,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的值不变?
不知各位大侠可否遇见过此类问题?盼复
代码:
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的值不变?
不知各位大侠可否遇见过此类问题?盼复
解决方案 »
- TCP通讯客户端怎样判断与服务器端断开
- C#如何实现给串口加LOCK?
- asp.net 操作注册表问题 小弟 愁了几天了希望那个有大虾帮忙!
- 过多循环是否为导致程序假死?
- VS2005加SQL2000
- 在C/S中主窗体中有一个状态栏,在子窗体中出发一个事件后,如何更新主窗体中的状态栏中的信息???
- struct问题
- SQL乱码,咋搞定..急死了~!~!~!~!~!
- devexpress如何用groupcontrol调用用户控件
- datagridview 模拟excel 公式 怎么获取单元格引用
- 使用 session.GetDatabase(notesServer,notesFile,false); 方法访问domino数据库的问题!
- 关于键盘监听
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);
}
}
}你的这个问题估计是因为多线程引发的
我单线程运行这段代码没有什么问题
可能被释放了,或者你在它原有的方法上清空了,所以循环复制把.
ods=queue.Dequeue();
运行的时候出错:无法将类型“object”隐式转换为“t3.Program.command”。存在一个显式转换(是否缺少强制转换?)求解啊……
谢谢楼主啦……