Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# e、 具有多个ReportProgress调用的BackgroundWorker progressChanged事件中的UserState为null_C#_.net_Winforms - Fatal编程技术网

C# e、 具有多个ReportProgress调用的BackgroundWorker progressChanged事件中的UserState为null

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

这是为ftp服务器下载文件的方法: 在下载方法中,当我执行以下操作时:

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总是提出一个新问题。我把它回滚到原来的问题。要么删除它,要么将你的答案作为答案发布。落选票可能来自糟糕的标题。朱哈尔,我不能,我被挡了。