progressbar赢得';t与后台工作人员一起更新
本文关键字:后台 工作人员 一起 更新 赢得 progressbar | 更新日期: 2023-09-27 18:26:30
im进行文件传输(服务器-客户端)TCP
我已经找过类似这样的问题了。。但没有一个答案对我有效。。
ProgressBar未使用backgroundworker进行更新。。我已经搜索了做这件事的教程。。我完全按照步骤走
表单在发送时和发送文件后都会滞后。。进度条变为100%
文件发送成功发送方法代码工作正常。。。我的问题只是更新进度条。。我该怎么解决??
在这里我调用(backgroundWorker1.RunWorkersync)
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;
}
似乎很奇怪,您可以从另一个线程为UI
控件赋值,而不会出现任何异常。或者,可能是一个真正的问题。就像我要做的第一件事一样,如果ProgressChanged
的代码在(比如)WindowsForm
类中,那么写如下:
private void backgroundWorker1_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
this.Invoke(new Action(()=>
progressBarFile.Value= e.ProgressPercentage;
));
}
像这样的东西。
您设置了吗?
worker.WorkerReportsProgress = true;
(在代码或属性窗口中)
编辑:
你不应该像这个一样阅读吗
count = fs.Read(data, 0, packetSize);
而不是读取data.Length
字节?由于您设置了data = new byte[fs.Length]
,因此将一次读取所有文件,而不是按小块读取,这是查看进度条逐渐变化所必需的。
感谢[Nikola Markovinović]他的回答是:
导致错误的行是:
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();
后台工作人员正在一个新线程上闲逛,因此,将任何东西调用回原始窗体及其控件(或原始线程)都需要一些委托才能完成您想要的任务。我有几个代码示例可以分享,但它们会占用这个网站太多的空间。作为快速帮助,请尝试此网站上的一些信息。
具有代表的后台工作人员
当然,你可以在谷歌上搜索更多关于线程、代理等的信息。我希望这会有所帮助。
好吧,这可能是一些奇怪的事情,但总是值得检查的步骤——它很容易被忽视首先:
- 您是否已将WorkerReportsProgress on the BackgroundWorker设置为true
- 您是否已将ProgressChanged事件连接到事件处理程序
最后,只需在下面的链接中将您的解决方案与示例进行比较,它可能会提醒您忘记做的事情:http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx