首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于多线程同步的有关问题,精通多线程机制的请进

2012-01-18 
关于多线程同步的问题,精通多线程机制的请进做的一个网络同步采集数据的程序,思路是缓冲区数据超过260个字

关于多线程同步的问题,精通多线程机制的请进
做的一个网络同步采集数据的程序,思路是缓冲区数据超过260个字节后开始处理。由于NetworkStream不支持获取缓冲区字节数,所以我想自己写个类,通过一个自定义缓冲区来达到支持的目的。代码如下:

C# code
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace CaijiTest
{
    class NetReceiveBuffer
    {
        TcpClient tc;
        int BufferLength;
        byte[] NetBuffer;
        NetworkStream netStream;
        Thread thread;
        ThreadStart ts;
        int iPosition=0;
        byte bt;
        public NetReceiveBuffer(string ip,int port,int length)
        {
            BufferLength = length;
            NetBuffer = new byte[length];
            tc = new TcpClient(ip, port);
            netStream = tc.GetStream();
            ts = new ThreadStart(Receive);
            thread = new Thread(ts);
            thread.Start();
        }

        public int BytesToRead
        {
            get
            {
                return iPosition;
            }
        }

        private void Receive()
        {
            while (true)
            {
                Thread.Sleep(1);
                NetBuffer[iPosition] = (byte)netStream.ReadByte();
                iPosition++;
                if (iPosition == NetBuffer.Length)
                {
                    Buffer.BlockCopy(NetBuffer, 1, NetBuffer, 0, NetBuffer.Length - 1);//丢弃第一个字节,后续数据向前移动一个字节
                    iPosition--;//回到缓冲区最后一个字节的位置
                }
            }
        }

        public void Read(byte[] buffer, int offset, int size)
        {
            lock (this)
            {
                Buffer.BlockCopy(NetBuffer, 0, buffer, offset, size);
                Buffer.BlockCopy(NetBuffer, size, NetBuffer, 0, iPosition - size);
                iPosition -= size;
            }
        }

        public byte ReadByte()
        {
            lock (this)
            {
                bt = NetBuffer[0];
                Buffer.BlockCopy(NetBuffer, 1, NetBuffer, 0, iPosition - 1);//丢弃第一个字节,后续数据向前移动一个字节


                iPosition--;
                return bt;
            }
        }


        ~NetReceiveBuffer()
        {
            thread.Abort();
        }
    }
}



问题是客户程序在操作Read()或ReadByte()方法的时候,thread线程还在继续读取数据,请问如何保证使用Read()或ReadByte()方法执行过程中缓冲区数据不会发生改变。

[解决办法]
在Receive里也lock(this),即会造成互斥。
[解决办法]
lock( NetBuffer)这个试试
[解决办法]
用lock正解

[解决办法]
生产者和消费者的问题,用lock或者Monitor都可以
[解决办法]
Socket.Available 就是你要的缓冲区字节数。
[解决办法]
参考C# WinForm开发系列 - Thread/Delegate/Event
[解决办法]
探讨
生产者和消费者的问题,用lock或者Monitor都可以

[解决办法]
lock(object) 正解
[解决办法]
互拆访问, 锁定资源, 用Monitor复杂一点, Lock方便, 效率嘛, 要看生产消费的比率了
[解决办法]
做一个全局的静态object
在Read(),ReadByte()和你的Receive中都lock这个静态的ojbect就可以做到互斥
[解决办法]
lock方便一些
[解决办法]
读写竞争问题可以先用lock做代码验证,但最好用ReaderWriterLock以达到性能最大化,.netfx3.5的话用ReaderWriterLockSlim更简单方便。

热点排行