【问题标题】:.net Out of Memory exceptions in Windows Mobile - how to overcome this problem?Windows Mobile 中的 .net 内存不足异常 - 如何解决此问题?
【发布时间】:2010-10-15 05:58:55
【问题描述】:

我目前正在使用 CF.NET 在 Windows Mobile 中编写一个小型应用程序。

该应用程序的行为与电子邮件应用程序非常相似,即我使用 POP3 从我的邮件服务器帐户下载消息和附件,以存储在存储卡上,以便使用 MIME 工具进行进一步处理。

我的问题是下载大型附件,因为在某个时候我遇到了 OutOfMemory 异常。通过阅读前几天发布的here on SO 的以下问答,我发现了一些有趣的事情。由于我的附件可以达到 4-5MB(mp3 歌曲),我意识到我遇到了严重的问题。但是,同时 Pocket Outlook 能够毫无问题地下载高达 4-5MB 的 mp3 歌曲(使用 WIFI 连接),所以一定有办法做到这一点!

目前,我正在将下载缓冲区(转换为字符串)保存到一个简单的字符串变量中。我尝试将缓冲区的内容添加到 stringbuilder 中,但仍然出现 OutOfMemory-exceptions。

我可以采用什么策略/技术来克服这个问题?

【问题讨论】:

    标签: .net email windows-mobile memory-management compact-framework


    【解决方案1】:

    每当您处理大量数据时,您都希望确保不会一次将整个数据保存在内存中。

    您的下载管道是一个流,因此您可以分块加载数据。将文件写入磁盘时,您有一个流,因此您可以一次写入一个块。

    考虑将拖拉机拖车卸载到仓库中。使用您的 stringbuilder 解决方案,您基本上是在说,“我将站在拖车的后面,我希望您将拖车的全部内容装载到我的怀里,然后我会把它带入仓库” .你会被负载压垮的!相反,你想要的是,“给我足够我可以实际携带的量,然后我将它带入仓库,然后再回来进行下一次装载”。

    【讨论】:

    • 克莱德:谢谢。我需要采用“块”方法。我将尝试找到一些代码示例如何做到这一点。我想我获取缓冲区的内容,将其保存在一个文件中,然后我清除缓冲区等等。对吗?
    • 这取决于您实际执行 POP 协议的方式。如果您正在创建原始连接并发送和接收文本,那么是的,您只需进入下载附件的部分并一次完成一点......
    • 但是,如果您使用 3rd 方库连接到 POP 服务器,则需要查看它们如何支持下载附件。任何好的软件都会提供一个 API 来将文件下载为流。否则你需要一个新的 API :-)。
    • 执行此操作时,请务必为应用程序提供一种简单的方式选择下载位置(即存储卡)。没有它,您将立即填满设备的主存储空间。
    • 实际上我正在尝试两种解决方案 - 自己的代码和第三方库。我会尝试你的建议,希望我能解决它。谢谢
    猜你喜欢
    • 2014-05-22
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多