C# FTP каталог создает и загружает вызывает замораживание формы - PullRequest
1 голос
/ 21 апреля 2020

У меня есть кнопка в форме, если я нажимаю на кнопку и начинаю проверять, существует ли каталог на FTP-сервере или нет, если нет, то каталог будет создан. После этой загрузки изображения в каталог, который был создан ранее, но это приводит к зависанию формы, поэтому я не могу ничего сделать в форме в течение нескольких секунд.

--- Проверка, существует ли каталог, и создать если нет ---

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;
        }
    }
}

--- Событие нажатия кнопки (загрузка файла) ---

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 Ответ

0 голосов
/ 21 апреля 2020

Когда вы выполняете какую-либо длительную операцию, вы не можете выполнять ее синхронно в потоке пользовательского интерфейса . Это остановит рассылку сообщений и пользовательский интерфейс замерзнет.

Вы должны запустить операцию в фоновом потоке или выполнить операцию асинхронно.

В качестве примера использования фонового потока для загрузки см. мой ответ на:
Как показать индикатор выполнения для загрузки с помощью FtpWebRequest

В качестве альтернативы для асинхронного решения используйте WebRequest.GetRequestStreamAsync.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...