问题描述:有多个模块,通过网络链接,本人想通过一台计算机同时对这些模块发送数据和接收数据,然后把接收到的数据写入数据库或者文件。
意思就是:通过本地计算机,建立多个Socket到模块的连接,然后发送数据及接收数据。因为要把接收的数据写入数据库或者文件,所以。。要让这些线程分开访问数据库或者文件。
我加了Lock()后,线程是分别访问公共模块的;但如果我要在这个模块中加入一个函数调用(用来对接收的数据进行分析的)后,则会引起线程之间的访问混乱。。不知道怎么解决,忘高人指点一二

解决方案 »

  1.   

    我说的混乱是,多个线程都进到公共区了。。
    也就是说第一个线程还没有结束对公共区的访问,其他线程就进去了。。
    可是我在第一个线程进去的时候锁了公共区的呀,,用LOCK(THIS)锁了撒为什么其他的线程还是可以进去??
    试过用Monitor.Enter(this)   Monitor.Exit(this)
    都没解决,,不知道怎么搞、、
      

  2.   

    lock:这样写的
    fuc aaa()
    {
        lock(this)
           {
               ab=ac/ab;
           }
    }Monitor:这样写的
    try
    {
       Monitor.Enter(this)
       ab=ac/ab;
       
    }
    finally
    {
       Monitor.Exit(this)
    }
      

  3.   

    没有问题啊,这种写法,其他线程绝对进不去,你可以在里面加sleep然后debug检查
      

  4.   

    我在主进程都加了Sleep,可是过了那个Sleep时间,晕了,它们还是往里边冲。。因为我里边有对数据库的操作,所以,肯定不能同时2,3个对一个表进行操作。。这样会引起数据混乱的。。唉,,郁闷死我了快。。你有没有例子,小点的,发一个给我,我瞧瞧我QQ:18817033
    MSN:[email protected]
    Email:[email protected]
      

  5.   

    private static object syncobj = new object();
    lock(syncobj)
    {
    }
    没代码,说的太模糊。
      

  6.   

    private static object syncobj = new object();
    lock(syncobj)
    {
    }
    没代码,说的太模糊。
    ========================================================
    function aaa()
    {
       在这里写??
       private static object syncobj = new object();
       lock(syncobj)
       {
       }
    }
      

  7.   

    我的意思是把锁定的对象变为一个私有的object 试试。如果不行,贴出主要代码看看。这样不太清楚。
      

  8.   

    Thread[] thr = new Thread[5];
            for (int i = 0; i < 3; i++)
            {
                thr[i] = new Thread(new ThreadStart(GetListen));
                thr[i].Name = i.ToString();
                //str = sr.ReadLine();
                
            }
            for (int i = 0; i < 3; i++)
            {
                thr[i].Start();
                Thread.Sleep(5000);
            }
            for (int i = 0; i < 3; i++)
            {
                thr[i].Abort();
            }
           private void GetListen()
          {
            lock (this)
            {
                string ipaddress = "192.168.0.101";
                string port = "10000";
                IPAddress ipa = IPAddress.Parse(ipaddress);
                IPEndPoint iep = new IPEndPoint(ipa, Convert.ToInt32(port));
                mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                byte[] bytes = new byte[4096];
                mysocket.Connect(iep);
                try
                {
                    byte[] sendbyte = new byte[1024];                sendbyte[0] = 0x32;
                    sendbyte[1] = 0x33;
                    sendbyte[2] = 0x03;
                    sendbyte[3] = 0x0B;
                    sendbyte[4] = 0x01;
                    mysocket.Send(sendbyte, 5, SocketFlags.None);
                    Thread.Sleep(1000);
                    mysocket.Receive(bytes);
                    string msg = Encoding.Default.GetString(bytes);
                    this.ListBox1.Items.Add(msg);
                }
                catch (SocketException ex)
                {
                    string aa = ex.Message.ToString();
                }
                mysocket.Shutdown(SocketShutdown.Both);
                mysocket.Close();
            }
        }
      

  9.   

    lock(this)没有问题,关键是你产生的线程是不是都是以同一个实例(公共资源)为基础的,如果不是同一个实例,那么lock自然不会起作用.
    比如:
    class myclass
    {
       public void fun()
       {
         lock(this)
          {
             ...
          }
       }
    }下面锁定就是可以接受的
    myclass x = new myclass();
    for (int i = 0; i < 10; i++) 
    {
             Thread t = new Thread(new ThreadStart(x.fun));
             t.Start();
    }
    下面的就是错误的
    myclass x = new myclass();
    myclass x2 = new myclass();
    Thread t = new Thread(new ThreadStart(x.fun));
    Thread t2 = new Thread(new ThreadStart(x2.fun));
    t.Start();
    t2.Start();虽然都是同一个类产生的,但是不是同一个对象,所以无法锁定.
    请注意你的线程对象实例是不是同一个(也就是公共资源),如果不是,那么把他定义成静态的或者单例模式
      

  10.   

    thr[i] = new Thread(new ThreadStart(GetListen));你看嘛,都是用了这个函数的。。可是它们就是直接往里边冲。。根本无视我那个Lock()的存在
      

  11.   

    我晕....
    for (int i = 0; i < 3; i++)
    {
        thr[i].Abort();
    }
    你中断线程干吗呢?线程工作完成后自然会自动释放.
    取消这段代码,根源啊