Xamarin.forms 将大图片上传到FTP会冻结应用程序

Xamarin.forms 将大图片上传到FTP会冻结应用程序,xamarin.forms,ftp,image-gallery,Xamarin.forms,Ftp,Image Gallery,我试图上传一些图片到我的FTP的形式。它在我的华为P20上运行得很好,但据我报道,在内存较少的手机上,当他们试图上传较大的图片时,应用程序会冻结 在图片选择(最多4个)之后,我调整了图片的大小并压缩它们以减小大小,但是运气不好 代码: 预期结果应该是应用程序不会在任何手机上冻结。 我能做些什么来防止它? 进一步增加压缩也不是最好的解决方案,因为有些手机上传它没有问题,因此我可以获得更高的质量 编辑:当上传一张大图片到FTP,我检查FTP上的图片时,图片的1/10被上传,其余为空白 EDIT2:将

我试图上传一些图片到我的FTP的形式。它在我的华为P20上运行得很好,但据我报道,在内存较少的手机上,当他们试图上传较大的图片时,应用程序会冻结

在图片选择(最多4个)之后,我调整了图片的大小并压缩它们以减小大小,但是运气不好

代码:

预期结果应该是应用程序不会在任何手机上冻结。 我能做些什么来防止它? 进一步增加压缩也不是最好的解决方案,因为有些手机上传它没有问题,因此我可以获得更高的质量

编辑:当上传一张大图片到FTP,我检查FTP上的图片时,图片的1/10被上传,其余为空白

EDIT2:将函数移动到另一个线程不会再冻结应用程序,但仍然只有部分图像上载到内存较少的设备上,如何强制上载整个图像

当上传一张大图片到FTP时,我检查了FTP上的图片,图片的1/10是上传的,其余是空白的

如果上传的图像非常大,那么这将是一个耗时的操作。如果将其放置在主UI线程中,将消耗大量内存和时间。当手机的内存大的时候,它可能能够完成任务,但是当手机不大的时候,问题就会出现

您需要将upload方法移动到后台线程,这样它就不会影响UI线程

如果在Android中,请尝试执行任务

public async Task<string> upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "")
{

  await Task.Run(() =>
  {
        try
        {
            WebRequest request = WebRequest.Create(FtpUrl+UploadDirectory);
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.Credentials = new NetworkCredential(userName, password);
            using (var resp = (FtpWebResponse)request.GetResponse())
            {

            }

        }
        catch(Exception e) {  }

        ...
  });
}
public async Task upload(字符串FtpUrl、字符串文件名、字符串用户名、字符串密码、字符串UploadDirectory=”“)
{
等待任务。运行(()=>
{
尝试
{
WebRequest=WebRequest.Create(FtpUrl+UploadDirectory);
request.Method=WebRequestMethods.Ftp.MakeDirectory;
request.Credentials=新的网络凭据(用户名、密码);
使用(var resp=(FtpWebResponse)request.GetResponse())
{
}
}
捕获(例外e){}
...
});
}
当上传一张大图片到FTP时,我检查了FTP上的图片,图片的1/10是上传的,其余是空白的

如果上传的图像非常大,那么这将是一个耗时的操作。如果将其放置在主UI线程中,将消耗大量内存和时间。当手机的内存大的时候,它可能能够完成任务,但是当手机不大的时候,问题就会出现

您需要将upload方法移动到后台线程,这样它就不会影响UI线程

如果在Android中,请尝试执行任务

public async Task<string> upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "")
{

  await Task.Run(() =>
  {
        try
        {
            WebRequest request = WebRequest.Create(FtpUrl+UploadDirectory);
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.Credentials = new NetworkCredential(userName, password);
            using (var resp = (FtpWebResponse)request.GetResponse())
            {

            }

        }
        catch(Exception e) {  }

        ...
  });
}
public async Task upload(字符串FtpUrl、字符串文件名、字符串用户名、字符串密码、字符串UploadDirectory=”“)
{
等待任务。运行(()=>
{
尝试
{
WebRequest=WebRequest.Create(FtpUrl+UploadDirectory);
request.Method=WebRequestMethods.Ftp.MakeDirectory;
request.Credentials=新的网络凭据(用户名、密码);
使用(var resp=(FtpWebResponse)request.GetResponse())
{
}
}
捕获(例外e){}
...
});
}

尝试对多次失败的大型文件的上载计时,看看它是否总是在一致的秒数后停止-如果这是原因,可能会有一些超时参数可以增加。如果不希望设备冻结,则需要将传输移动到bg线程。我对线程等非常陌生,你能给我举个例子吗?试着对一个失败多次的大文件的上传计时,看看它是否总是在一致的秒数后停止-如果这是原因,可能会有一些超时参数你可以增加。如果你不想设备冻结,你需要将传输移动到bg线程。我对线程和这样,你们能给我举个例子吗?我现在对返回值有问题,它说转换为void returning委托的匿名函数不能返回值。(这是处理程序的情况),任务1表示异步方法的返回类型必须为void,Task或Task我已将该方法更改为public async Task,但现在什么也得不到uploaded@ChrisFodor是 啊我更新
Task
instaed of
string
。这需要时间才能上载成功。
RotateImage
在上载完成时还需要使用Task继续。一旦用户选择图像并关闭库及其等待的图像,RotateImage就会完成。所以它不应该干扰。我等了一会儿,但照片没有上传。处理者呢?如何让它返回字符串?@ChrisFodor哦,这里可能无法使用处理程序。您的代码需要返回值。我现在对返回值有问题,它说转换为void returning delegate的匿名函数无法返回值。(这是处理程序的情况),任务1表示异步方法的返回类型必须为void,Task或Task我已将该方法更改为public async Task,但现在什么也得不到uploaded@ChrisFodor是 啊我更新
Task
instaed of
string
。这需要时间才能上载成功。
RotateImage
在上载完成时还需要使用Task继续。一旦用户选择图像并关闭库及其等待的图像,RotateImage就会完成。所以它不应该干扰。我等了一会儿,但照片没有上传。处理者呢?我怎样才能让它返回字符串?@ChrisFodor哦,这里可能无法使用处理程序。您的代码需要返回值。
 public string upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "")
    {

        try
        {
            WebRequest request = WebRequest.Create(FtpUrl+UploadDirectory);
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.Credentials = new NetworkCredential(userName, password);
            using (var resp = (FtpWebResponse)request.GetResponse())
            {

            }

        }
        catch(Exception e) {  }



        try
        {

            string PureFileName = new FileInfo(fileName).Name;
            String uploadUrl = String.Format("{0}{1}/{2}", FtpUrl, UploadDirectory, PureFileName);

            FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl);
            req.Proxy = null;
            req.Method = WebRequestMethods.Ftp.UploadFile;
            req.Credentials = new NetworkCredential(userName, password);
            req.UseBinary = true;
            req.UsePassive = true;
            byte[] data = File.ReadAllBytes(fileName);
            req.ContentLength = data.Length;
            Stream stream = req.GetRequestStream();
            stream.Write(data, 0, data.Length);
            stream.Close();
            FtpWebResponse res = (FtpWebResponse)req.GetResponse();
            return res.StatusDescription;

        }
        catch (Exception err)
        {
            return err.ToString();
        }
    }
public async Task<string> upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "")
{

  await Task.Run(() =>
  {
        try
        {
            WebRequest request = WebRequest.Create(FtpUrl+UploadDirectory);
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.Credentials = new NetworkCredential(userName, password);
            using (var resp = (FtpWebResponse)request.GetResponse())
            {

            }

        }
        catch(Exception e) {  }

        ...
  });
}