Мой метод C # UploadFile успешно загружает файл, но мой пользовательский интерфейс зависает - PullRequest
1 голос
/ 01 января 2011

У меня есть простое тестовое приложение WinForms на C #. Используя следующий метод, я могу загрузить файл при вызове метода из обработчика события Click моей кнопки. Единственная проблема: моя форма Windows "зависает". Я не могу закрыть его с помощью кнопки Закрыть. Я должен завершить выполнение из среды IDE (Visual C # 2010 Express Edition). Вот два метода:

    public void UploadFile(string FullPathFilename) {
        string filename = Path.GetFileName(FullPathFilename);

        try {

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + filename);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(_remoteUser, _remotePass);

            StreamReader sourceStream = new StreamReader(FullPathFilename);
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());

            request.ContentLength = fileContents.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            response.Close();
            requestStream.Close();
            sourceStream.Close();

        }
        catch (Exception ex) {                
            MessageBox.Show(ex.Message, "Upload error");
        }
        finally {

        }

    }

который вызывается здесь:

    private void btnUploadTxtFile_Click(object sender, EventArgs e) {

        string username = "my_username";
        string password = "my_password";
        string host = "ftp://mywebsite.com";

        try {
            clsFTPclient client = new clsFTPclient(host + "/httpdocs/non_church/", username, password);
            client.UploadFile(Path.GetDirectoryName(Application.ExecutablePath) + "\\myTextFile.txt");
        }
        catch (Exception ex) {
            MessageBox.Show(ex.Message, "Upload problem");
        }
    }

1 Ответ

1 голос
/ 02 января 2011

Вы забыли задать вопрос. Я предполагаю, что вы хотите знать, как избежать замерзания. То, как вы реализовали загрузку, занимает всю цепочку за относительно долгое время. Это неплохо, но плохо, если у этого потока есть другие важные задачи, в данном случае пользовательский интерфейс.

Если вы создаете новый для вас поток, вам действительно стоит посмотреть на него, потому что следующее решение - это просто исправление, оно не очень хорошо, но работает. Замените вызов UploadFile на

        new System.Threading.Thread(() => client.UploadFile(Path.GetDirectoryName(Application.ExecutablePath) + "\\myTextFile.txt")).Start();
...