典型的生产者,消费者问题用lock锁住对象
  
*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html

解决方案 »

  1.   

    谢谢feiyun0112的回答,,我知道用lock,但问题不在这里,,,
    问题是在这个地方:
    localhost.MyWebService myweb=new localhost.MyWebService("http://"+xmllist[i].ToString()+"/webxml/MyWebService.asmx");
    _ds=myweb.SQLDB("sdf");
    循环的时候会上一次创建的_ds覆盖掉,,这里应该怎么解决,,这里也能用lock吗?
    这个不是在线程里,这是在一个按钮事件里
      

  2.   

    循环取数据,然后新开一个子线程去导入数据。
    这样做感觉效率不高,最好是能一次性把所有的Webservices的数据都取回来
    然后在采取新的线程作导入数据的处理。
    这样能减少IO操作,提高效率。循环里面取数据的方式感觉不太合适。同时这样的模式感觉不太好,
    因为你每次都是取的不同的DataSet,最好是不用这样的属性的模式。
    可以声明一个委托,参数是一个DataSet。
    线程可以调用这个委托,已取回来的DataSet作为参数,用来同步数据
      

  3.   

    谢谢菜菜,如果你还在线的话,能不能说得再详细一点
    假如全部取过来,那怎么来存储这14个dataset另外,不用属性模式,用委托的话,那应该怎么来实现,
    我没有用过委托,,不是很清楚,还请菜菜能够指点指点,
      

  4.   

    因为我现在属性的就是出现了问题,会把上一个创建的线程的_ds数据集覆盖掉,
    还有,线程调用方法能不能参数,我测试N久,好象不行,还请各位在线的高手多多指点
      

  5.   

    用一个类把你线程的东西封装起来,每一个线程就是一个新的实例,这样每一个类的dataset就不同了,再把所有的实例放到arraylist里面,这样子arraylist[n]就是你的dataset了,每个dataset就触立了不知道有没有理解错楼主的意思了
      

  6.   

    谢谢siyou(QQ~在线),你理解的完全正确,爱死你了,,
      

  7.   

    siyou(QQ~在线),你理解是对了,但是你说的意思我不怎么明白.
    你说的:"用一个类把你线程的东西封装起来,每一个线程就是一个新的实例,这样每一个类的dataset就不同了",,但是ExcuteImport()方法里Ds怎么取值正如caicai_45(菜菜)说的,循环取数据,然后新开一个子线程去导入数据.
      

  8.   

    我的意思是,把你ExcuteImport()这个东东,封装到一个类里面
    Thread thd = new Thread( new ThreadStart(类名.ExcuteImport));//////<注释2>然后通过类的属性来获取返回值至于“类名.ExcuteImport”,你可以用arraylist.add(类名.ExcuteImport)来统一管理好这些实例的,以后就用
    ((类名.ExcuteImport)arraylist[n]).属性
    来获取返回值
      

  9.   

    不好意思,上面有点错假设你现在把ExcuteImport()封装到class1里面去class1里面有一public的ds那么初始化类的时候肯定是
    class1 abc = new class1()那么首先把abc的ds赋值,然后把abc加到arraylist中去,代码如:arraylist.add(abc)然后用((class1)arraylist[n]).ExcuteImport起线程
    完成后用((class1)arraylist[n]).ds获取返回值由于N的不同,就造成了不同的DS不知道我理解得对不对