上次我发的帖子
http://topic.csdn.net/u/20100730/16/58390430-402a-4db7-b61f-b1cf253c49ff.html后来经过测试,情况如下:文件传输采用多线程来处理,界面更新采用委托去更新但是文件下载好了,可是界面更新还没有完成,如果只是一对一,更新跟下载完成的时间差不多但是如果是一对多,下载完成了,可是界面更新要很久才能完成界面更新是更新文件下载完成的进度,1%更新一次,如果我改成10%更新一次,效果会好点,但是这不是解决问题的最好方法。请大家给个改进的思路,谢谢!
http://topic.csdn.net/u/20100730/16/58390430-402a-4db7-b61f-b1cf253c49ff.html后来经过测试,情况如下:文件传输采用多线程来处理,界面更新采用委托去更新但是文件下载好了,可是界面更新还没有完成,如果只是一对一,更新跟下载完成的时间差不多但是如果是一对多,下载完成了,可是界面更新要很久才能完成界面更新是更新文件下载完成的进度,1%更新一次,如果我改成10%更新一次,效果会好点,但是这不是解决问题的最好方法。请大家给个改进的思路,谢谢!
代码如下: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; } }
}
如果有多个文件传输,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); //停止下载=================================================
1.实际的数据传输,看看无ui的情况下,传输效率如何。如果有可能,优化这里的协议。
2.抛开传输,单纯更新界面,设置ProgressBar的最大最小为0~传输文件的长度,分割成一定的份,多线程更新ProgressBar。
以上2个单独测试的例子都没问题。和在一起就不会有问题。