Как приостановить и возобновить процесс WebRequestMethods.Ftp.UploadFile?

Как приостановить и возобновить процесс загрузки по 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();

Спасибо.


person Prince OfThief    schedule 31.01.2011    source источник


Ответы (1)


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

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

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

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

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

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

person Matías Fidemraizer    schedule 31.01.2011