C# 如何使用backgroundworker和progressbar进行ftp文件上载?

C# 如何使用backgroundworker和progressbar进行ftp文件上载?,c#,.net,winforms,C#,.net,Winforms,在form1 designer中,我有一个backgroundworker,我在designer中将WorkerReportsProgress和WorkerSupportsScanCellation设置为true 我有一个form1 designer中的progressBar1 还有两个backgorundworker事件:DoWork和ProgressChanged。 在DoWork事件中,我调用使ftp文件从另一个类上载的方法: private void backgroundWorker1_

在form1 designer中,我有一个backgroundworker,我在designer中将WorkerReportsProgress和WorkerSupportsScanCellation设置为true

我有一个form1 designer中的progressBar1

还有两个backgorundworker事件:DoWork和ProgressChanged。 在DoWork事件中,我调用使ftp文件从另一个类上载的方法:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            uploadftp.upload(@"c:\temp\FtpTestFile.txt", false);
        }
在form1构造函数中,我将启动backgroundworker:

backgroundWorker1.RunWorkerAsync();
这是uploadftp类中的upload方法:

public void upload(string filename, bool uploadtosubortoroot)
    {
        try
        {
            FtpWebRequest request = null;
            if (uploadtosubortoroot == true)
            {
                request = (FtpWebRequest)FtpWebRequest.Create(
                host + "/" + directory + "/" + Path.GetFileName(filename));
            }
            else
            {
                request = (FtpWebRequest)FtpWebRequest.Create(
                host + "/" + Path.GetFileName(filename));
            }
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(user, pass);
            StreamReader sourceStream = new StreamReader(filename);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

            response.Close();
        }
        catch (Exception err)
        {
            string t = err.ToString();
        }    
    }
我想让它做的是,当文件上传时,progressBar将从0%开始进度到100%,其中0%是开始上传时的进度,100%是完成上传文件时的进度

在上传方法中,我没有找到任何可以注册的已完成事件,因此它会告诉我该文件上传良好且已完成

编辑:

这就是我迄今为止所尝试的:

在form1中,我在按钮单击事件中添加了一个按钮:

private void button3_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
在backgorundworker DoWork事件的表格1中,我做了:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            uploadftp.upload(@"c:\temp\FtpTestFile.txt", false, (BackgroundWorker)sender);
        }
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
在ProgressChanged事件中,我做了:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            uploadftp.upload(@"c:\temp\FtpTestFile.txt", false, (BackgroundWorker)sender);
        }
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
backgorundworker完成事件仍然为空

在upload方法中的类中,我执行了以下操作:

public void upload(string filename, bool uploadtosubortoroot,BackgroundWorker bworker)
    {
        try
        {
            FtpWebRequest request = null;
            if (uploadtosubortoroot == true)
            {
                request = (FtpWebRequest)FtpWebRequest.Create(
                host + "/" + directory + "/" + Path.GetFileName(filename));
            }
            else
            {
                request = (FtpWebRequest)FtpWebRequest.Create(
                host + "/" + Path.GetFileName(filename));
            }
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(user, pass);
            StreamReader sourceStream = new StreamReader(filename);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            bworker.ReportProgress(0, "Uploading file...");
            requestStream.Close();
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

            response.Close();
        }
        catch (Exception err)
        {
            string t = err.ToString();
        }    
    }

但它从来没有报告或没有进展。

将您的
后台工作人员的参考信息传递到
上传方法
BackgroundWorker
的事件创建事件处理程序:

.ReportProgress
-在执行方法
ReportProgress
时更新progressbar


.RunWorkerCompleted
-在执行
DoWork
事件的事件处理程序后更新progressbar

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    uploadftp.upload(@"c:\temp\FtpTestFile.txt", false, (BackgroundWorker)sender);
}

public void upload(string filename, 
                   bool uploadtosubortoroot, 
                   BackgroundWorker bworker)
{
    try
    {
        //I assume your progressbar.MaxValue = 100
        bworker.ReportProgress(0);
        FtpWebRequest request = null;
        if (uploadtosubortoroot == true)
        {
            request = (FtpWebRequest)FtpWebRequest.Create(
            host + "/" + directory + "/" + Path.GetFileName(filename));
        }
        else
        {
            request = (FtpWebRequest)FtpWebRequest.Create(
            host + "/" + Path.GetFileName(filename));
        }
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(user, pass);
        bworker.ReportProgress(20);
        StreamReader sourceStream = new StreamReader(filename);
        byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
        sourceStream.Close();
        request.ContentLength = fileContents.Length;
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(fileContents, 0, fileContents.Length);
        requestStream.Close();
        bworker.ReportProgress(50);
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

        response.Close();
        bworker.ReportProgress(100);
    }
    catch (Exception err)
    {
        string t = err.ToString();
    }    
}

我不熟悉FtpWebRequest,但这里有一个建议:例如,如果进度条有15个可见步骤,那么在启动时将该数字传递给工作线程。然后将语句“requestStream.Write(fileContents,0,fileContents.Length);”替换为一个小循环,该循环将文件的1/15写入requestStream,通知GUI线程,写入文件的下一个1/15,通知GUI线程,等等。在写入文件的最后一块后,执行requestStream.Close()并通知GUI线程上传已经完成。正如RenniePet所说,如果你想看到进度报告,你不能在一次调用中全部上传数据。你需要把它写成更小的部分,并更新每一部分之间的进度。法比奥,你能看看我到目前为止做了什么吗?更新了我的问题。在类中的upload方法中,我执行了以下操作:bworker.ReportProgress(0,“上载文件…”);不确定我应该放什么来代替0,也不确定行i是否在正确的位置,也不确定在创建时重新报告的上载方法中的第一行应该放在哪里。在已完成事件的form1中,我不确定我应该做什么。我想我只是错过了这一切。
.RunWorkerCompleted
如果您想在工作完成后以主窗体(GUI线程)显示某些内容,可以使用事件处理程序。在您的情况下,
ReportProgress
方法不需要第二个参数。我用你的密码更新了答案。