C#带byte[]参数的线程操作

.Net技术 码拜 9年前 (2016-05-31) 1362次浏览
小弟要实现,从主程序传递一个byte[]数据到另一个线程,在byte[]到object的时候看不懂网上的代码,出现错误

class Program
    {
        static void Main(string[] args)
        {
//主程序,从串口定时读取数据,保存到data这个byte[]
            //byte[] data = new byte[xx];//xx是个变化的量,最大会超过256,不到512
//为了方便测试,不管读串口的程序,用简单的3个数组来测试后续程序       
byte[] data = new byte[3];    
            data[0]=11;
            data[1]=21;
            data[2] = 31;
            object O_data = Bytes2Object(data);
            Thread t = new Thread(new ParameterizedThreadStart(B));
//从网上查了下,线程传递一个参数,必须是object类型,然后有百度了一些byte[]转object函数
            t.Start(O_data);
            Console.Read();
        }
        private static void B(object obj)
        {
            Console.WriteLine("Method {0}!", obj.ToString());
        }
//网上直接贴来的函数,看不懂实现机制,想直接用下byte[]转object,用上面的3个数组测试,报下面 的错误
        /// <summary> 
        /// 将一个序列化后的byte[]数组还原         
        /// </summary>
        /// <param name="Bytes"></param>         
        /// <returns></returns> 
        public static object Bytes2Object(byte[] buff)
        {
            object obj;
            using (MemoryStream ms = new MemoryStream(buff))
            {
                IFormatter iFormatter = new BinaryFormatter();
                obj = iFormatter.Deserialize(ms);//在分析完成之前遇到流结尾,这里出错?
            }
            return obj;
        }
        /// <summary> 
        /// 将一个object对象序列化,返回一个byte[]         
        /// </summary> 
        /// <param name="obj">能序列化的对象</param>         
        /// <returns></returns> 
        public static byte[] ObjectToBytes(object obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return ms.GetBuffer();
            }
        }
    }
解决方案

20

直接传就可以了,Bytes2Object和ObjectToBytes中两个函数可以不要。t.Start(data);原因是byte数组本来就是Object类型的数据。然后在你的B函数中在转换回来就可以了。

private static void B(object obj)
        { 
            byte[] data = (byte[])obj;
            Console.WriteLine("Method {0}!", obj.ToString());
        }

20

第一个问题:
线程参数类型是 Object,此时不是需要一个 Object 类型,而是 Object 是基本类型。
byte[] 也是 Object,可以直接传给线程当参数。
在使用的时候,直接转换成 byte[] 就可以使用。
不需要转换的。
第二个问题:
很多的 Object,例如你定义个类型,假如这个类型你需要保存起来,或传输给其他的使用者。
那么这个 Object 怎么保存呢?需要保存为二进制流,
此时就需要把 Object 转换为二进制流,这个操作就叫做 序列化和反序列化。(Serialize)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#带byte[]参数的线程操作
喜欢 (0)
[1034331897@qq.com]
分享 (0)