请wuyazhe(逍遥兄)、computerfox(阿捷)等高手帮忙

wade008 2010-08-12 09:46:13
上次我发的帖子
http://topic.csdn.net/u/20100730/16/58390430-402a-4db7-b61f-b1cf253c49ff.html

后来经过测试,情况如下:

文件传输采用多线程来处理,界面更新采用委托去更新

但是文件下载好了,可是界面更新还没有完成,如果只是一对一,更新跟下载完成的时间差不多

但是如果是一对多,下载完成了,可是界面更新要很久才能完成

界面更新是更新文件下载完成的进度,1%更新一次,如果我改成10%更新一次,效果会好点,但是这不是解决问题的最好方法。

请大家给个改进的思路,谢谢!
...全文
110 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wade008 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyazhe 的回复:]

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

好的,我试下
兔子-顾问 2010-08-12
  • 打赏
  • 举报
回复
问题简化分开成2部分。
1.实际的数据传输,看看无ui的情况下,传输效率如何。如果有可能,优化这里的协议。
2.抛开传输,单纯更新界面,设置ProgressBar的最大最小为0~传输文件的长度,分割成一定的份,多线程更新ProgressBar。
以上2个单独测试的例子都没问题。和在一起就不会有问题。
wade008 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dylike 的回复:]

把界面更新代码写在TIMER里试试。
[/Quote]

如果有多个文件传输,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); //停止下载=================================================
wade008 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gxingmin 的回复:]

先计算有几个文件需要下载,比方说下载10个文件,那么下载一个文件,更新10%
[/Quote]


进度变化的事件,我重新包了个类,去继承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; }

}
}

dylike 2010-08-12
  • 打赏
  • 举报
回复
把界面更新代码写在TIMER里试试。
gxingmin 2010-08-12
  • 打赏
  • 举报
回复
先计算有几个文件需要下载,比方说下载10个文件,那么下载一个文件,更新10%
gxingmin 2010-08-12
  • 打赏
  • 举报
回复
是你没计算好更新速度(step)
wade008 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lanfengsese 的回复:]

下载完成就把界面速度更新完咯
[/Quote]

用消息去更新的,下载完成了,更新还是没有同步到
天下如山 2010-08-12
  • 打赏
  • 举报
回复
学习下 不懂的路过学习
Peter200694013 2010-08-12
  • 打赏
  • 举报
回复
菜鸟路过
lanfengsese 2010-08-12
  • 打赏
  • 举报
回复
下载完成就把界面速度更新完咯

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧