C# 如何使用backgroundworker和progressbar进行ftp文件上载?
在form1 designer中,我有一个backgroundworker,我在designer中将WorkerReportsProgress和WorkerSupportsScanCellation设置为true 我有一个form1 designer中的progressBar1 还有两个backgorundworker事件:DoWork和ProgressChanged。 在DoWork事件中,我调用使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_
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
方法不需要第二个参数。我用你的密码更新了答案。