Загрузка асинхронного ftp файла с индикатором выполнения - PullRequest
0 голосов
/ 24 апреля 2018

Итак, я пытаюсь загрузить файл с FTP и хочу показать текущий прогресс на компоненте индикатора выполнения. Я запускаю задачу, как это с пользовательским FtpClient классом:

SaveFileDialog sfd = new SaveFileDialog();

if (sfd.ShowDialog() == true)
{
    pBar.Visibility = Visibility.Visible;
    string status = "";
    string filename = entry.FileName.Text;

    await Task.Run(() =>
    {
        status = client.DownloadFile(filename, sfd.FileName, pBar);
    });

    statusBox.Text = status.Substring(4);
}

public string DownloadFile(string source, string dest, ProgressBar pBar)
{
    FtpWebRequest sizeRequest = CreateRequest(CombinePaths(url, source), WebRequestMethods.Ftp.GetFileSize); // creates FtpWebRequest and assigns method
    FtpWebResponse sizeResponse = (FtpWebResponse)sizeRequest.GetResponse();

    if (sizeResponse.ContentLength <= 0) // if server does not support SIZE
        pBar.IsIndeterminate = true;
    else
    {
        pBar.IsIndeterminate = false; // fails here since progress bar is in the another thread
        pBar.Maximum = sizeResponse.ContentLength;
        pBar.Value = 0;
    }

        byte[] buffer = new byte[buffSize];

using (FtpWebResponse dlResponse = (FtpWebResponse)dlRequest.GetResponse())
{
    using (Stream stream = dlResponse.GetResponseStream())
    {
        using (FileStream fs = new FileStream(dest, FileMode.OpenOrCreate))
        {
            int readCount = stream.Read(buffer, 0, buffSize);

            while (readCount > 0)
            {

                fs.Write(buffer, 0, readCount);
                pBar.Value = pBar.Value + readCount;
                readCount = stream.Read(buffer, 0, buffSize);
            }
        }
    }
    return dlResponse.StatusDescription;
}

Есть ли способ заставить эту работу? Поскольку я загружаю и пытаюсь обновить пользовательский интерфейс, я не знаю, есть ли способ сделать то, что я хочу

1 Ответ

0 голосов
/ 24 апреля 2018
                pBar.Dispatcher.Invoke(() =>
            {
                if (GetFileSize(source) <= 0)
                    pBar.IsIndeterminate = true;
                else
                {
                    pBar.IsIndeterminate = false;
                    pBar.Maximum = GetFileSize(source);
                    pBar.Value = 0;
                }
            });
            // code...
            pBar.Dispatcher.Invoke(() =>
            {
                pBar.Value = pBar.Value + readCount;
            });

Используется диспетчер для обновления индикатора выполнения, работает без нареканий

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