我正在进行文件传输(服务器 - 客户端)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;
}
答案 0 :(得分:1)
看起来很奇怪,你可以从另一个线程为一个UI
控件分配一个值而不会出现任何异常。或 可能是真正的问题。
就像我要做的第一件事,如果ProgressChanged
的代码在(比如说)WindowsForm
类中,请像这样写:
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
this.Invoke(new Action(()=>
progressBarFile.Value= e.ProgressPercentage;
));
}
像这样的东西。
答案 1 :(得分:1)
你有没有设置?
worker.WorkerReportsProgress = true;
(在代码或属性窗口中)
编辑:
你不应该这样读吗
count = fs.Read(data, 0, packetSize);
而不是读取data.Length
个字节?由于您设置了data = new byte[fs.Length]
,因此文件将一次性读取,而不是以小块形式读取,这是为了逐步查看进度条所需的。
答案 2 :(得分:1)
感谢[NikolaMarkovinović]他的回答是:
导致错误的行是:
data = new byte[fs.Length];
纠正代码后:
data = new byte[packetSize];
while (sum < fileSize)
{
count = fs.Read(data, 0, data.Length);
network.Write(data, 0, count);
sum += count;
backgroundWorker1.ReportProgress((int)((sum * 100) / fileSize));
}
network.Flush();
答案 3 :(得分:0)
后台工作者在一个新线程上徘徊,因此,调用任何东西回到原始形式,其控件(或原始线程)将需要一些委托来完成你想要的。我有几个代码示例,我可以分享,但他们会在这个网站上占用太多空间。作为快速帮助,请尝试从本网站获取部分信息。
Background Worker with Delegates
当然,您可以随时通过Google了解有关线程,代表等的更多信息。我希望有所帮助。
答案 4 :(得分:0)
嗯,这可能是古怪的,但总是值得检查一下它容易忽略的步骤:
最后,只需将您的解决方案与下面链接中的示例进行比较 - 它可能会让您想起您忘记做的事情: http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx