Как добавить тайм-аут в асинхронный запрос FtpWebRequest - PullRequest
0 голосов
/ 20 июня 2019

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

 FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl + filename);
            request.UsePassive = false;
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(ftpUser, ftpPass);
            request.Timeout = 10000; //10 second timeout

            byte[] fileContents = File.ReadAllBytes(fullPath);
            request.ContentLength = fileContents.Length;
            //Stream requestStream = await request.GetRequestStreamAsync();
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);

            requestStream.Close();

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

Вопрос в том, как заставить тайм-аут работать при асинхронном вызове?

1 Ответ

0 голосов
/ 21 июня 2019

Из документа Свойство FtpWebRequest.Timeout , Тайм-аут - это количество миллисекунд, в течение которых синхронный запрос, выполненный с помощью метода GetResponse, ожидает ответа, а метод GetRequestStream ожидает потока.Таким образом, больше нет API для его асинхронного использования.

Может быть, это может быть хорошим способом для его реализации. Вставка FtpWebRequest кода в задачу для попытки.

// Start a new task (this launches a new thread)
Task.Factory.StartNew (() => {
    // Do some work on a background thread, allowing the UI to remain responsive
    DoSomething();
// When the background work is done, continue with this code block
}).ContinueWith (task => {
    DoSomethingOnTheUIThread();
// the following forces the code in the ContinueWith block to be run on the
// calling thread, often the Main/UI thread.
}, TaskScheduler.FromCurrentSynchronizationContext ());
...