C# FTP Directory create and upload is causing form freeze

点点圈 提交于 2020-05-14 07:39:27

问题


I have a button on the form if I click on the button then starting to check if the directory on FTP server exists or not, if not then the directory will be create. After this uploading the picture to the directory which was created before but it's causing a form freeze so I can't do nothing on the form for a few seconds.

--- Checking if the directory is exist & create it if not ---

private bool CreateFTPDirectory()
{

    try
    {
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://127.0.01" + txtDirName.Text));
        requestDir.Method = WebRequestMethods.Ftp.MakeDirectory;
        requestDir.Credentials = new NetworkCredential("username", "password");
        requestDir.UsePassive = true;
        requestDir.UseBinary = true;
        requestDir.KeepAlive = false;
        FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse();
        Stream ftpStream = response.GetResponseStream();

        ftpStream.Close();
        response.Close();

        return true;
    }
    catch (WebException ex)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;
        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
        {
            response.Close();
            return true;
        }
        else
        {
            response.Close();
            return false;
        }
    }
}

--- Button click event (uploading the file) ---

private void btnApply_Click(object sender, EventArgs e)
{
    CreateFTPDirectory(); /// calling the private bool CreateFTPDirectory
    string imgname = "xyz.jpg";

    System.Net.FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/" + txtDirName.Text + "/" + imgname);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("username", "password");

    using (MemoryStream sourceStream = new MemoryStream())
    {
        PointF infoLocation = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2, 0);

        string date = DateTime.UtcNow.ToString("dd.MM.yyyy");

        Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
        Screen.PrimaryScreen.Bounds.Height);
        Graphics graphics = Graphics.FromImage(bitmap as Image);
        graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);

        using (Font arialFont = new Font("Arial", 10))
        {
            graphics.DrawString(date, arialFont, Brushes.Green, infoLocation);
        }
        bitmap.Save(sourceStream, ImageFormat.Jpeg);
        using (System.IO.Stream requestStream = request.GetRequestStream())
        {
            sourceStream.Position = 0; sourceStream.CopyTo(requestStream);
        }
    }
}

回答1:


When you are doing any lengthy operation, you cannot do it synchronously on the UI thread. That will stop the message pump and the UI freezes.

You must run the operation on a background thread or run the operation asynchronously.

For an example of use of the background thread for the upload, see my answer to:
How can we show progress bar for upload with FtpWebRequest

Alternatively, for an asynchronous solution, use WebRequest.GetRequestStreamAsync.



来源:https://stackoverflow.com/questions/61345576/c-sharp-ftp-directory-create-and-upload-is-causing-form-freeze

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!