采用线程池或IO完成端口,想实现多线程并发请求一个服务的效果,但线程执行的方法加Lock(this)后,所有的线程都是顺序执行的,并不能实现并发访问。请问有什么好办法实现并发请求,又能确保线程安全么?

解决方案 »

  1.   

    为每个线程创建一个服务对象实例。如果只是读没有写,那么不用lock也行。
      

  2.   

    请求的是什么服务啊
    如果是webservice它本来就需要多线访问
      

  3.   

    缩小lock中的限制对象,既不要用this,用线程间出现冲突的最小对象。
      

  4.   

    谢谢!那个服务是Remoting服务。请求里有个参数是数组的,而数组又是非线程安全,要确保线程安全的话就要在这个请求上加LOCK,而每个请求耗时又较长,所以性能一直提不上去,请问有什么更好的办法实现并发请求么?
      

  5.   

    to 那个服务是Remoting服务。请求里有个参数是数组的,而数组又是非线程安全,要确保线程安全的话就要在这个请求上加LOCK,而每个请求耗时又较长,所以性能一直提不上去,请问有什么更好的办法实现并发请求么?Sample code as follows:
    int[] nArray = new int[...];
    lock( nArray )
    {
    // Only one thread can access the array 
    }
      

  6.   

    感谢Knight94(愚翁),这样做确实能保证数组的线程安全,可是,那个比较耗时的请求Remoting服务操作也要Lock里面,所以还是顺序执行请求,并不是并发请求,所以性能并没有提升。有什么办法既让数组安全,有能实现真正的并发请求服务的造作么?Sample code as follows:
    int[] nArray = new int[...];
    lock( nArray )
    {
        User user = obj.GetUser(nArray)   //假设这个请求要250毫秒,如何让它并发请求呢??
    }
      

  7.   

    to 这样做确实能保证数组的线程安全,可是,那个比较耗时的请求Remoting服务操作也要Lock里面,所以还是顺序执行请求,并不是并发请求,所以性能并没有提升。有什么办法既让数组安全,有能实现真正的并发请求服务的造作么?根据你的需求,你可以如下修改,即在访问数组的时候,进行加锁,而真正进行传送的时候,不需要加锁,这里可以用属性来完成,例如:class TestArray
    {
          private int[] nArray;
          public int[] Numbers
          {
              get{
                   lock( nArray )
                   {   
                   int[] nCopy = new int[...];
                   //Copy the array using "Array.Copy"
                   return nCopy;
                   }
              }
              
          }
    }//in thread access
    User user = obj.GetUser( yourTestArray.Numbers );
      

  8.   

    最后采用将线程操作放在一个Class里,每个线程new一个线程操作对象,这样就不用加Lock了。感谢大家!