不知道大家用过sina的点点通没有?请问它里面的下载内容是怎么实现的。
我现在模仿它作了个多线程下载的东西,用户点击下载--〉开一个新的下载线程---〉线程开始的时候--〉(用委托)异步变化tree的图标--〉开始下载数据并处理--〉下载完成有用委托异步变化tree的图标但是这个实现别人说有问题,就是说微软不推荐在线程中变化界面的东西。然后朋友给我一个方法就是不开多线程通过异步调用去下载数据,就是说用户点击“下载”按钮然后异步下载数据,最后用回调委托变化tree的图标。这么做是可以解决线程变化图标的问题。但是这么做有个操作是没办法处理的,就是“全部下载”,比如用户设置机器最多可以3个线程同时下载,而点击“全部跟新”按钮有10个要下载的,那么自然另外的7个要进入队列中,这样不用线程就没办法处理请大家给个思路。。
还有一个就是我现在很大的问题,我用线呈变化tree的图标,当开3个以上线呈以后变化图标的时候,tree明显感觉有个闪烁的过程
谢谢大家了。。

解决方案 »

  1.   

    system.net.sockets
    system.net.sockets.socket
    提供的下载类有很多,msdn中有例子!
      

  2.   

    cnlcg(cnlcg) 你没搞清楚我的问难。
      

  3.   

    单独写一个下载的类,自己定义下载完成事件及处理该事件的类信息,然后在下载完成后触发下载完成事件,在UI层更改TREE的图标
      

  4.   

    to:zhgroup(Hotel California)我现在就这么做的,但是我要用程序自动一起下10个点的东西,不开多线程怎么解决?你说的在“在UI层更改TREE的图标” 最终还是在线程中异步修改了界面的东西,还是有问题的吧。
      

  5.   

    不是在线程修改,是线程中事件完成,UI线程得到此消息,由UI线程修改。如果由线程修改,就要INVOKE
      

  6.   

    to:zhgroup(Hotel California)..你这样的做法难道不需要用invoke?..能不能给我例子?我是通过委托回调界面函数修改界面的阿,难道和你的意识不一样?不知道你的“UI线程得到此消息”是什么意识?是指用委托或者事件通知界面吗?
      

  7.   

    给你个例子吧:
    delegate void DownloadComplete( DownloadEventArgs e );
    class Download{
     public event DownloadComplete DownloadEventHandler;
     
     private Thread _thread;
     
     ..初始化数据
     
     public void StartDownload()
     {
       开始下载数据,起始线程
       _thread.Start();
      }
     private void DownloadData()
     {
        //此方法执行下载,下载完成后,引发下载完成事件,并传下载数据
     }
    }在Form中:
     Download dl = new Download();
     dl.DownloadComplete += ....注册事件
     private void 处理事件,更改UI信息以上只是伪代码,大概就是这个意思,将线程的初始化放在CLASS中
      

  8.   

    to 但是这么做有个操作是没办法处理的,就是“全部下载”,比如用户设置机器最多可以3个线程同时下载,而点击“全部跟新”按钮有10个要下载的,那么自然另外的7个要进入队列中,这样不用线程就没办法处理请大家给个思路。。这方面你可以模仿FlashGet,即如果当前的线程数是3个,且已经运行了,当修改这个参数,需要重新运行线程,即需要先停止当前所有3个线程,然后再按照10个线程进行分配,最后开启这个10个线程。
      

  9.   

    ...to:Knight94(愚翁) 。。我现在实现的效果:有10个目录要下载,而一次只能下3个目录,当用户点击“全部更新”,
    那么程序开始下载其中3个目录,还有7个目录要存在对列中等待更新,当3个目录中其中一个下载完成,等待的对列中就自动加一个去下载。而我还需要更改这个新加上的目录在界面上的一些相关的元素。
    我的做法是:当程序遇到下载操作的时候,启动一个新的线程类(线程类是自己封装的),把界面上目录的node存到线程类中,然后在线程中通过委托回调(也就是事件)的方法更改node的imageinex...(也就是更该界面的元素)
    (备注:我已经封装了一个线程类,里面注册了一些相关事件)现在的问题:就是说微软不推荐在线程中变化界面的东西。
    我想换个实现的方法,。把原来通过线呈的方法---〉改为异步调用来实现。。具体应该怎么做了?
      

  10.   

    to:zhgroup(Hotel)我的做法和你一样。:)private void 处理事件,更改UI信息这个方法我实在界面类中写的。
    但是你这样修改界面的元素一定要用invoke.
      

  11.   

    代码和zhgroup(Hotel California) 的思路一样
    :),他用的事件,我用的委托。。一样
      

  12.   

    我看了大家的东西,觉得我的下载设计还是没有问题的。。但是就是奇怪,为什么最后下完了以后,为什么界面的tree会闪一下。