2014-09-10 3 views
1

Я пытаюсь перебрать список изображений и ftp их на сервер. Он частично работает, за исключением того, что он все еще блокирует мой поток пользовательского интерфейса. Хотя моя функция ftp является асинхронной, я предполагаю, потому что мой метод вызова не является, я не получаю результаты, которые я ищу. Вот что я получил. Что я делаю не так?Async FTP Upload Список файлов

public void UploadPictures() 
    { 
     //loop through each picture and upload 
     for (int i = 0; i < this.items.Count; i++) { 

      byte[] bytes; 
      if (System.IO.Path.GetExtension (this.items [i].FileName.ToUpper()) == ".JPG") { 
       using (var imageData = this.items[i].Image.AsJPEG()) 
       { 
        bytes = new byte[imageData.Length]; 
        Marshal.Copy(imageData.Bytes, bytes, 0, Convert.ToInt32(imageData.Length)); 
       } 
       var test=UploadPhoto(bytes, this.items[i].FileName); 

      } 

      if (System.IO.Path.GetExtension (this.items [i].FileName.ToUpper()) == ".PNG") { 
       using (var imageData = this.items[i].Image.AsPNG()) 
       { 
        bytes = new byte[imageData.Length]; 
        Marshal.Copy(imageData.Bytes, bytes, 0, Convert.ToInt32(imageData.Length)); 
       } 
       var test=UploadPhoto(bytes, this.items[i].FileName); 

      } 


     } 



    } 



    public static async Task<string> UploadPhoto(byte[] photoBytes, string filename) 
    { 
     FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://XXXXXXXX/" + filename); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 
     request.Credentials = new NetworkCredential ("user", "pass"); 
     request.UseBinary = true; 

     request.ContentLength = photoBytes.Length; 
     using (Stream s = request.GetRequestStream()) 
     { 
      s.Write(photoBytes, 0,photoBytes.Length); 
     } 
     WebResponse ftpResp = await (Task<WebResponse>)request.GetResponseAsync(); 

     return ftpResp.ToString(); 

    } 

ответ

2

Марк UploadPictures в async и await на UploadPhoto.

+0

Я пробовал это раньше и не мог заставить его работать правильно. Я точно не помню, в чем проблема. Тем не менее, я использовал Task Run и работал (см. Мой пост). Благодаря! – darrellbooker

0

Итак, я позвонил в свою функцию UploadPictures, используя Task run, и это сработало. Не уверен, что это самый правильный способ сделать это.

Task.Run(() => 
        { 
         UploadPictures(); 
      });