Agarwal1984 Ответов: 1

Как отобразить Кбит / с и общий размер файла во время загрузки файла с ftp с помощью приложения C# .NET windows?


Привет,

How to display kbps and total file size on label during file download from ftp using c# .net windows application?


но получаю ошибку:-
Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.


в этой строке:-
labelProgress.Text = Convert.ToString(iProgress);


Пожалуйста, помогите мне.

заранее спасибо.

Анкит Агарвал
инженер-программист

Что я уже пробовал:

string[] files = ReadFileList();
FTPSettings.IP = " xxxx";
FTPSettings.Идентификатор пользователя = "ХХХХХ";
FTPSettings.Пароль = " xxxxx";
//FtpWebRequest reqFTP = null;
//FtpStream поток = нулевой;
foreach (строковый файл в файлах)
{
//string fileName = E. аргумент.Метод toString();

Запрос FtpWebRequest = (FtpWebRequest)WebRequest.Create ("ftp://" + FTPSettings.IP + " / " + файл);
запрос.Учетные данные = new NetworkCredential(FTPSettings.UserID, FTPSettings.Пароль);
запрос.Способ = WebRequestMethods.По FTP.GetFileSize;
запрос.Прокси = null;

long fileSize; / / это ключ для ReportProgress
using (WebResponse resp = request. GetResponse())
размер = респ.ContentLength;

request = (FtpWebRequest)WebRequest.Create ("ftp://" + FTPSettings.IP + " / " + файл);
запрос.Учетные данные = new NetworkCredential(FTPSettings.UserID, FTPSettings.Пароль);
запрос.Способ = WebRequestMethods.По FTP.Downloadfile следует;
using (FtpWebResponse responseFileDownload = (FtpWebResponse)request. GetResponse())
using (Stream responseStream = responseFileDownload.GetResponseStream())
using (FileStream writeStream = new FileStream (@"C:\abc\" + файл, файловый режим.Создавать))
{

int Length = 2048;
Byte [] buffer = новый байт[длина];
int bytesRead = responseStream. Read(буфер, 0, длина);
int байт = 0;

while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream. Read(буфер, 0, длина);
bytes += bytesRead;/ / не забудьте увеличить bytesRead !
int iProgress = 0;
int totalSize = (int)(размер файла) / 1000; / / Кбайт
if (totalSize > 0)
{
iProgress = (байт / 1000) * 100 / totalSize;
}
labelProgress.Текст = Преобразовать.ToString(iProgress);
labelTotalSize.Текст = Преобразовать.ToString(totalSize);
backgroundWorker1. ReportProgress(iProgress, totalSize);

}
}

1 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на сообщение об ошибке:

Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.

Это довольно откровенно.
Вы не можете получить доступ к любому элементу управления пользовательского интерфейса из любого потока, кроме потока, в котором он был создан, - потока пользовательского интерфейса.
Ваш код работает в другом потоке-вероятно, в результате события" FTP operation completed " или аналогичного-поэтому для доступа к элементу управления вам придется вызвать его: Практическое руководство практическое руководство.[^]