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;
    }

progressbar赢得';t与后台工作人员一起更新

似乎很奇怪,您可以从另一个线程为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();

后台工作人员正在一个新线程上闲逛,因此,将任何东西调用回原始窗体及其控件(或原始线程)都需要一些委托才能完成您想要的任务。我有几个代码示例可以分享,但它们会占用这个网站太多的空间。作为快速帮助,请尝试此网站上的一些信息。

具有代表的后台工作人员

当然,你可以在谷歌上搜索更多关于线程、代理等的信息。我希望这会有所帮助。

好吧,这可能是一些奇怪的事情,但总是值得检查的步骤——它很容易被忽视首先:

  1. 您是否已将WorkerReportsProgress on the BackgroundWorker设置为true
  2. 您是否已将ProgressChanged事件连接到事件处理程序

最后,只需在下面的链接中将您的解决方案与示例进行比较,它可能会提醒您忘记做的事情:http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx