进度条不会与后台工作者一起更新?

时间:2012-03-03 22:40:04

标签: c# winforms progress-bar backgroundworker

我正在进行文件传输(服务器 - 客户端)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;
    }

5 个答案:

答案 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)

嗯,这可能是古怪的,但总是值得检查一下它容易忽略的步骤:

  1. 您是否已将BackgroundWorker上的WorkerReportsProgress设置为true?
  2. 您是否已将ProgressChanged事件连接到事件处理程序?
  3. 最后,只需将您的解决方案与下面链接中的示例进行比较 - 它可能会让您想起您忘记做的事情: http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx