C# e、 具有多个ReportProgress调用的BackgroundWorker progressChanged事件中的UserState为null
这是为ftp服务器下载文件的方法: 在下载方法中,当我执行以下操作时:C# e、 具有多个ReportProgress调用的BackgroundWorker progressChanged事件中的UserState为null,c#,.net,winforms,C#,.net,Winforms,这是为ftp服务器下载文件的方法: 在下载方法中,当我执行以下操作时: var progress = bytesRead * 100.0 / writeStream.Length; bw.ReportProgress((int)progress); Thne由于某种原因,在progressChanged事件中,即使我有报告,e.UserState也是空的: string SummaryText = String.Format("File Name {0} / {1}", "", filenam
var progress = bytesRead * 100.0 / writeStream.Length;
bw.ReportProgress((int)progress);
Thne由于某种原因,在progressChanged事件中,即使我有报告,e.UserState也是空的:
string SummaryText = String.Format("File Name {0} / {1}", "", filenameonly);
bw.ReportProgress(0, SummaryText);
如果没有第二次报告,那么e.UserState工作正常
public void DownloadFtpContent(object sender ,string file, string filesdirectories,string fn)
{
try
{
BackgroundWorker bw = sender as BackgroundWorker;
string filenameonly = Path.GetFileName(file);
string ftpdirectories = Path.Combine(ftpcontentdir, filesdirectories);
string fileurl = "ftp://" + file;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(fileurl);
reqFTP.Credentials = new NetworkCredential(UserName, Password);
reqFTP.UseBinary = true;
reqFTP.UsePassive = true;
reqFTP.KeepAlive = true;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.Proxy = null;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream responseStream = response.GetResponseStream();
if (!Directory.Exists(ftpdirectories))
{
Directory.CreateDirectory(ftpdirectories);
}
FileStream writeStream = new FileStream(ftpdirectories + "\\" + filenameonly, FileMode.Create);
string fnn = ftpdirectories + "\\" + filenameonly;
int Length = 2048;
Byte[] buffer = new Byte[Length];
int bytesRead = responseStream.Read(buffer, 0, Length);
string SummaryText = String.Format("File Name {0} / {1}", "", filenameonly);
bw.ReportProgress(0, SummaryText);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, Length);
var progress = bytesRead * 100.0 / writeStream.Length;
bw.ReportProgress((int)progress);
}
writeStream.Close();
response.Close();
}
catch (WebException wEx)
{
//MessageBox.Show(wEx.Message, "Download Error");
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message, "Download Error");
}
}
在form1中,在progressChanged事件中,当我使用e.UserState时,我得到一个异常,表示它为null:
private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.toolStripStatusLabel2.Text = e.UserState.ToString();
this.toolStripProgressBar2.Value = Math.Min(this.toolStripProgressBar2.Maximum, e.ProgressPercentage);
}
第一次还行,但第二次它进入了ProgressChanged,并试图使e.UserState行出现异常
例外情况是:
System.NullReferenceException was unhandled by user code
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=FTP_ProgressBar
StackTrace:
at FTP_ProgressBar.Form1.backgroundWorker2_ProgressChanged(Object sender, ProgressChangedEventArgs e) in c:\ftp_progressbar\FTP_ProgressBar\Form1.cs:line 566
InnerException:
第566行是:this.toolStripStatusLabel2.Text=e.UserState.ToString() 通过在while循环中的下载方法中只报告一次,我解决了这个问题:
string SummaryText = String.Format("File Name {0} / {1}", "", filenameonly);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, Length);
var progress = bytesRead * 100.0 / writeStream.Length;
bw.ReportProgress((int)progress, SummaryText);
}
您并不总是传递状态:
bw.ReportProgress((int)progress)代码>这是我的错误,我更改了报告,因此报告仅在while循环中,并且我还报告了SummaryText变量,因此现在它工作正常。但是我还有一个问题,我不确定是在这里描述它还是提出一个新问题,因为所有的信息都已经在这里了。@HorheElFenenado总是提出一个新问题。我把它回滚到原来的问题。要么删除它,要么将你的答案作为答案发布。落选票可能来自糟糕的标题。朱哈尔,我不能,我被挡了。