上次我发的帖子
http://topic.csdn.net/u/20100730/16/58390430-402a-4db7-b61f-b1cf253c49ff.html后来经过测试,情况如下:文件传输采用多线程来处理,界面更新采用委托去更新但是文件下载好了,可是界面更新还没有完成,如果只是一对一,更新跟下载完成的时间差不多但是如果是一对多,下载完成了,可是界面更新要很久才能完成界面更新是更新文件下载完成的进度,1%更新一次,如果我改成10%更新一次,效果会好点,但是这不是解决问题的最好方法。请大家给个改进的思路,谢谢!

解决方案 »

  1.   

    是你没计算好更新速度(step)
      

  2.   

    把界面更新代码写在TIMER里试试。
      

  3.   

    进度变化的事件,我重新包了个类,去继承System.EventArgs
    代码如下:public class MultiEjOnlineProgressEventArgs : System.EventArgs                
        {                                                        
            /// <summary> 用于保存事件信息 </summary>
            private string FMessage = string.Empty;        /// <summary> 用于保存百分比值 </summary>
            private uint   FPercent = 0;        /// <summary> 用于执行状态值 </summary>
            private bool   FCancel = false;        public MultiEjOnlineProgressEventArgs(string Message, uint Percent)        //构造函数
            {                                                    
                if(Message == null)
                                 FMessage = string.Empty;
                else 
                                 FMessage = Message;
                FPercent = Percent;    
                            FCancel = false;        }        public string Message                                                    //获取事件信息
            {                                                    
                get                                                        
                {    return FMessage;    }        }        public uint Percent                                                        //获取百分比值
            {                                                            
                get                                            
                {    return FPercent;    }        }
            
            public bool Cancel                                                        //获取/设置执行状态
            {                                                                                    get                                                                    
                {    return FCancel;    }
                set                                                                    
                {    FCancel = value;    }        }
        }
      

  4.   


    如果有多个文件传输,timer好像不好做以下是下载的Code
     while (bRet) //开始下载=================================================
                {
                    nRet = Online_StLoad(PCommData, 0, ref nTLength, ref nSLength); //下载文件
                    if (nRet > 2) { bRet = false; break; }                if (ProgressEvent != null) //进度指示处理
                    {
                        try
                        {
                            if (nTLength <= 0) nTLength = 0;
                            if (nSLength <= 0) nSLength = nTLength;
                            if (nSLength <= 0) nPercent = 100;
                            else nPercent = (uint)((nTLength * 100) / nSLength);                        MultiEjOnlineProgressEventArgs e = new MultiEjOnlineProgressEventArgs(SFile, nPercent);
                            if (e != null)
                            {
                                ProgressEvent(sender, e);
                                if (e.Cancel) { bRet = false; bCb = true; }
                            }
                        }
                        catch
                        { bRet = false; }
                    }                if (!bRet || nRet == 2) break; //如果回调返回FALSE值,则终止函数的执行
                    Thread.Sleep((int)Esctime);
                }            if (bCb == true)
                    Online_ESC_z(PCommData, Address);
                Online_StLoad(PCommData, 1, ref nTLength, ref nSLength); //停止下载=================================================
      

  5.   

    问题简化分开成2部分。
    1.实际的数据传输,看看无ui的情况下,传输效率如何。如果有可能,优化这里的协议。
    2.抛开传输,单纯更新界面,设置ProgressBar的最大最小为0~传输文件的长度,分割成一定的份,多线程更新ProgressBar。
    以上2个单独测试的例子都没问题。和在一起就不会有问题。