Как приостановить и возобновить процесс WebRequestMethods.Ftp.UploadFile? - PullRequest
0 голосов
/ 31 января 2011

Как приостановить и возобновить процесс загрузки по FTP? Мой процесс загрузки следующий код. Как реализовать паузу и возобновить процесс?

FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + host + defaultDir + "/" + fileInf.Name));

reqFTP.Credentials = new NetworkCredential(user, pass);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;

int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
int maxLen = contentLen;
while (contentLen != 0)
{
                // Write Content from the file stream to the FTP Upload Stream
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
}

strm.Close();
fs.Close();

Спасибо.

1 Ответ

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

Вы хотели бы реализовать асинхронную задачу.

Прежде всего, прочитайте эту статью: http://aspalliance.com/1778

Используя асинхронные задачи, вы сможете приостановить и / или возобновить фоновый поток, и пусть поток обрабатывает загрузку файла завершение запроса, сохранение слотов в пуле потоков IIS.

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

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

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

...