c# – 使用读取和写入流来保存文件时损坏的图像

c# – 使用读取和写入流来保存文件时损坏的图像,第1张

概述程序员大家好 我正在使用Xamarin(iOS)在应用程序中实现下载功能,以获得正在下载的文件的进度. 我使用的代码是来自网络各处的各种示例,显示相同的主体,编码风格的最大区别.它们都在System.IO.File上使用相同的ReadAsync和WriteAsync函数,并使用字节数组作为缓冲区. 但无论我转向什么样的例子,它都会导致图片上出现不同的文物,如下所示: (原始/下载) 我似乎无法找到 程序员大家好

我正在使用Xamarin(iOS)在应用程序中实现下载功能,以获得正在下载的文件的进度.

我使用的代码是来自网络各处的各种示例,显示相同的主体,编码风格的最大区别.它们都在System.IO.file上使用相同的ReadAsync和WriteAsync函数,并使用字节数组作为缓冲区.

但无论我转向什么样的例子,它都会导致图片上出现不同的文物,如下所示:

(原始/下载)

我似乎无法找到任何理由发生这种情况.
我尝试了不同的东西,看看有什么可以触发这个.我发现将缓冲区更改为更大的大小(比如10240)会导致更多的伪像,而更小的缓冲区(比如1024)会导致更少的伪像.

在调试不同的东西时,我找到了“避免”这种情况发生的“方法”,但这包括在WriteAsync刚完成后立即添加一个任务延迟,持续20毫秒(在代码中注释掉) – 不是我想要的解决方案有,但告诉问题可能在于两个流的使用(据我所知,’仅限’基本用法’).
我也尝试使用非异步方法,但给出了相同的结果.

希望有人能告诉我这里做错了什么,以及为什么.

提前致谢

public async Task<bool> MakeDownloadRequestAsync(string url,string destination,Action<string,long,float> progress = null) {    if (_downloadhttpClIEnt == null) {        _downloadhttpClIEnt = new httpClIEnt (new NativeMessageHandler());    }    bool finished = false;    try {        var result = await _downloadhttpClIEnt.GetAsync(url,httpCompletionoption.ResponseheadersRead);        long receivedBytes = 0;        long totalBytes = result.Content.headers.ContentLength.HasValue ? result.Content.headers.ContentLength.Value : 0;        System.Diagnostics.DeBUG.Writeline ("Started download file: {0}",url);        using (var stream = await _downloadhttpClIEnt.GetStreamAsync (url))        {            byte[] buffer = new byte[4096];            var filename = Path.Getfilename (url);            var writeStream = _fileStore.OpenWrite (Path.Combine(destination,filename));            while(true)            {                int bytesRead = await stream.ReadAsync(buffer,buffer.Length);                if (bytesRead == 0)                {                    finished = true;                    System.Diagnostics.DeBUG.Writeline ("Finished downloading file: {0}",url);                    break;                }                await writeStream.WriteAsync(buffer,buffer.Length);                //Task.Delay(20);                receivedBytes += bytesRead;                if (progress != null)                {                    progress.Invoke(url,receivedBytes,totalBytes,(float)receivedBytes/(float)totalBytes);                }            }            writeStream.dispose();            stream.dispose();        }    } catch (Exception e) {        System.Diagnostics.DeBUG.Writeline (e);    }    return finished;}
解决方法 你的问题可能就是这一行:
await writeStream.WriteAsync(buffer,buffer.Length);

它应该是:

await writeStream.WriteAsync(buffer,bytesRead);

您的代码正在编写整个缓冲区…无论实际读取的字节数是多少.相反,您应该只写入实际读取的字节数.

总结

以上是内存溢出为你收集整理的c# – 使用读取和写入流来保存文件时损坏图像全部内容,希望文章能够帮你解决c# – 使用读取和写入流来保存文件时损坏的图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1252374.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存