【发布时间】:2012-03-03 22:40:04
【问题描述】:
我正在进行文件传输(服务器-客户端)TCP
我已经在寻找类似的问题了..但没有答案对我有用..
ProgressBar 不会随 backgroundworker 更新 .. 我已经搜索了执行此操作的教程 .. 我完全按照这些步骤操作。
发送时和发送文件后表单滞后.. 进度条变为 100%
成功发送的文件发送方法代码工作正常...我的问题只是更新进度条..我该如何解决这个问题??
我在这里调用 (backgroundWorker1.RunWorkerAsync)
public void Send(string destPath)
{
if (listView1.Items.Count > 0)
{
List<String> job = new List<string>();
job.Add(listView1.Items[0].ToolTipText);
job.Add(destPath);
backgroundWorker1.RunWorkerAsync(job);
}
}
DoWork方法
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
List<string> job = (List<string>)e.Argument;
SendFile(job[0],job[1]);
}
这是我使用的 SEND 方法 (backgroundWorker1.ReportProgress)
private void SendFile(string srcPath, string destPath)
{
string dest = Path.Combine(destPath, Path.GetFileName(srcPath));
using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
{
try
{
long fileSize = fs.Length;
sizeAll = fileSize;
long sum = 0;
int count = 0;
data = new byte[fs.Length];
SendCommand("receive<" + dest + "<" + fs.Length.ToString());
while (sum < fileSize)
{
if (fileSize - sum < packetSize)
{
count = fs.Read(data, 0, (int)(fileSize - sum));
network.Write(data, 0, (int)(fileSize - sum));
}
else
{
count = fs.Read(data, 0, data.Length);
network.Write(data, 0, data.Length);
}
fs.Seek(sum, SeekOrigin.Begin);
sum += count;
sumAll += count;
backgroundWorker1.ReportProgress((int)((sum * 100) / fileSize));
}
network.Flush();
}
finally
{
CloseTransfer();
}
}
}
这里是 backgroundWorker1_ProgressChanged
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarFile.Value= e.ProgressPercentage;
}
【问题讨论】:
-
progresschanged 方法是否被调用?如果是这样,调用堆栈是什么样的?
-
你确定传输的文件是一样的吗?因为 fs.Seek 对我来说似乎不合适;它在第一遍后返回到 0 偏移量,并在第二遍中重新读取数据的第一个 packetSize。我认为您无论如何都不需要 Seek,因为文件阅读器将在最后一个读取字节后保持在第一个位置。
-
而不是 data = new byte[fs.Length];写入数据 = 新字节 [packetSize];并删除 fs.Seek。我相信进度条会起作用。文件传输有效的唯一原因是它是在一个数据包中读取和发送的。
-
谢谢哥们..我已经修复了..代码是正确的..只是数据包大小的东西..我应该删除我的问题吗??
-
我是这里的新手,所以我真的不知道,但我认为你不应该删除问题,因为其他人可能会从你的错误中吸取教训 ;-) 并且一定要删除 fs.Seek 因为它会损坏您的文件。
标签: c# winforms progress-bar backgroundworker