在wince中进行局域网内的大文件下载。因为wince的文件读写操作很慢,而局域网的下载速度又比较快,跟常见的网络速度慢于文件速度相反,wince是下一个文件只要30秒,反而写文件用掉了2分钟。因此企图实现“一边下载一边写文件”的操作,但实现起来总有问题。原始文件25M1.单线程,每次从网络流(HttpWebResponse)读取64k字节,然后写入文件,循环操作,耗时2分半左右
发现不管buffer设成64k,640k,甚至8M,对耗时影响不大。写文件是每写一次就fulsh,还是最后close自动flush,影响也不大2.异步BeginWrite,因为读取的buffer随时都在变,没想到好的办法3.直接多线程。自己弄了个缓存 List<byte[]>,每次从网络流读取的字节,Add进这个list,然后文件流线程一发现list增加了,就去把新的字节按顺序写入文件流。结果出了个问题,List<byte[]>每次被网络流操作(Add)的时候,此时若文件线程读取这个list,读到的永远是null,即使读的某个项的确有数据。看来同一资源在某个时刻,只能被某线程独占访问?最后在网络流Add的时候,加入标志位来屏蔽其他线程的读取,才解决这个问题,但最后,这个多线程耗时比单线程还长。那么,应该怎么做这个缓存池,才能实现:下载线程随便往池里倾倒数据,文件线程随便读取池中数据,互不干扰呢?谢谢

解决方案 »

  1.   

    多线程和异步文件io都可以,缓冲的设计一般是用队列,先进先出次序,用List不好,应该用LinkedList,没必要加标志位,用lock就可以,LinkedList<byte[]> lstBuffer=new LinkedList<byte[]>();...网络操作://这里从网络中读取aData,注意要放在lock前面,不要放在lock里面,lock(lstBuffer)
    {
    lstBuffer.AddLast(aData);
    }文件线程比较复杂,
    Byte[] aItem=null;lock(lstBuffer)
    {
    aItem=lstBuffer.First.Value;
    lstBuffer.RemoveFirst();
    }//然后把aItem写入,同样的,要放在lock后面,而不要放在lock里面,
      

  2.   

    按stonespace的方法,使用的queue,加上lock,这个池用起来也蛮ok。但是速度跟单线程读写差别不大,前者用了2分24秒,后者用了2分27秒,只快了3秒。其中下载平均用时30秒左右(900k/s),写文件将近2分钟。搞不懂了,不过学会了这个简单缓存的技巧,还是谢了。