BackgroundWorker ReportProgress из другого класса

1

Я собираюсь в кругах искать и читать форумы о том, как решить эти проблемы. После дня попыток я все еще в недоумении, как решить свою проблему. Я загружаю файл и должен вернуть% in aa текстовое поле. У меня нет проблем с частью загрузки и нет проблем с возвратом значений с помощью BackgroundWorker, если я включу весь мой код в один класс. Однако то, что я делаю, вызывает класс ftp из form1. Мне нужен класс ftp, чтобы вернуть процент в form1, чтобы я мог отображать в своем пользовательском интерфейсе, а также должен иметь коды ответов сервера, возвращенные из моего класса ftp, чтобы отображать в моей форме1. Все работало нормально, прежде чем я попытался запустить это в процессе BackgroundWorker, за исключением того, что пользовательский интерфейс становится невосприимчивым и возвращает все сообщения о статусе после завершения загрузки. Вот мой код, как сейчас. Как получить процент от класса ftp и передать его обратно в form1, а также код ответа сервера после его завершения?

public partial class Form1 : Form
{
    private BackgroundWorker bw = new BackgroundWorker();
    private string ftpServer = @"ftp://10.0.0.0";
    private string ftpUser = @"user";
    private string ftpPass = @"pass";
    private string ftpRemoteFile = @"myfile.exe";
    private string ftpLocalFile = @"C:\Uploads\file.exe";

    public Form1()
    {
        InitializeComponent();
        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    }

    private void sendButton_Click(object sender, EventArgs e)
    {
        progressRichTextBox.Text = "Sending";
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        ftp ftpClient = new ftp(ftpServer, ftpUser, ftpPass);
        ftpClient.upload(progressRichTextBox, ftpRemoteFile, ftpLocalFile);
    }
    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!(e.Error == null))
        {
            this.progressRichTextBox.Text = ("Error: " + e.Error.Message);
        }

        else
        {
            this.progressRichTextBox.Text = "Done!";
        }
    }
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.progressRichTextBox.Text = (e.ProgressPercentage.ToString() + "%");
    }
}

И heres класс ftp:

    public void upload(System.Windows.Forms.RichTextBox progressRichTextBox, string remoteFile, string localFile)
    {

        FileInfo fileInfo = new FileInfo(localFile);
        /* Create an FTP Request */
        ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
        /* Log in to the FTP Server with the User Name and Password Provided */
        ftpRequest.Credentials = new NetworkCredential(user, pass);
        /* Specify generic group name for faster upload */
        ftpRequest.ConnectionGroupName = "AffiliateUpload";
        /* Specify the Type of FTP Request */
        ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
        /* Server connection options */
        ftpRequest.UseBinary = true;
        ftpRequest.UsePassive = true;
        ftpRequest.KeepAlive = true;
        ftpRequest.ContentLength = fileInfo.Length;
        /* Buffer for the Data */
        byte[] buff = new byte[bufferSize];
        int contentLen;
        /* Open a File Stream to Read the File for Upload */
        FileStream localFileStream = fileInfo.OpenRead();

        try
        {
            // Stream to which the file to be upload is written
            ftpStream = ftpRequest.GetRequestStream();

            // Read from the file stream 2kb at a time
            contentLen = localFileStream.Read(buff, 0, bufferSize);

            // Till Stream content ends
            while (contentLen != 0)
            {
                // Write Content from the file stream to the 
                // FTP Upload Stream
                ftpStream.Write(buff, 0, contentLen);
                contentLen = localFileStream.Read(buff, 0, bufferSize);
            }

            // Close the file stream and the Request Stream
            ftpStream.Close();
            localFileStream.Close();
            ftpRequest = null;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Failed sending to " + host + "/" + remoteFile + " (" + ex.Message + ")");
        }
    }
Теги:
winforms
ftp
backgroundworker

1 ответ

0
Лучший ответ

Вам не нужно обновлять progressRichTextBox в вашем методе загрузки. Удалите этот параметр. Вам необходимо предоставить worker объект вашему методу загрузки и вызвать на нем worker.ReportProgress.

  • 0
    Спасибо, что решил половину моей проблемы, поэтому я могу вернуть% выполнено сейчас. Вторая половина моей проблемы заключается в том, что мне нужно возвращать код ответа сервера, когда возвращается исключение, как в моем методе catch класса ftp. В форме 1 у меня есть логика для RunWorkerCompleted, но я не уверен, как передать что-нибудь обратно при ошибке. В случае успешного завершения я вижу "Готово!" сообщение, но я никогда не вижу сообщение «Ошибка:». Чего мне не хватает в этой части?
  • 0
    Проверьте этот пост. stackoverflow.com/questions/5499657/...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню