解决asp.net中CF 3.5 Bitmap(Stream)未处理异常问题

VS2008开发环境,在进行.NET CF 3.5下的WM Socket编程时

Bitmap bmp = new Bitmap(Stream)处出现未处理异常

通过摸索,我发觉无论将对象如何设置为null和Dispose,这个问题依然存在。

究其原因,个人猜测是Bitmap实例化时本身就会打开MemoryStream流,所以再用MemoryStream就很容易内存泄露

因此强列建议,当和Bitmap一起合用时,用 FileStream或其它变通方法替代MemoryStream,并及时内存回收。

以下是使用参考示例:

主要功能是:拍照上传。

 代码如下 复制代码

View Code public class PhotoHelper
    {
        BaseForm _form;       //拍照上传窗体
        TextBox _txtFileName; //显示照片路径
        PictureBox _picPhoto; //显示照片缩略图
  
        public PhotoHelper(BaseForm form,TextBox txtFileName,PictureBox picPhoto)
        {
            _form = form;
            _txtFileName = txtFileName;
            _picPhoto = picPhoto;
            _picPhoto.Image = new Bitmap(300, 350);

        }

     
 

       #region 拍照逻辑
        public void TakePhoto()
        {
            //拍照-----------------------------         
            CameraCaptureDialog ccd = new CameraCaptureDialog();
            ccd.Mode = CameraCaptureMode.Still;
            ccd.Owner = _form;
            ccd.Title = "拍照";
            ccd.Resolution = new Size(1600, 1200);
            ccd.StillQuality = CameraCaptureStillQuality.Normal;

            if (ccd.ShowDialog() == DialogResult.OK)
            {
                //将拍好的以缩略图显示
                ImageChangedArgs args = new ImageChangedArgs(ccd.FileName);
                using (Graphics g = Graphics.FromImage(_picPhoto.Image))
                {

                    g.DrawImage(args.Image,
                        new Rectangle(0, 0, _picPhoto.Image.Width, _picPhoto.Image.Height),
                        new Rectangle(0, 0, args.Image.Width, args.Image.Height),
                        GraphicsUnit.Pixel);

                }
                args.Dispose();
                args = null;
               
                _txtFileName.Text = ccd.FileName;

            }
            ccd.Dispose();
            ccd = null;
        }        
      #endregion

      #region 照片上传逻辑

       public  void PhotoSave()
        {
            if (string.IsNullOrEmpty(_txtFileName.Text))
            {
                Global.ShowMsg("无照片可上传");
                return;
            }

            string prompt = "确认上传照片?";
            if (Global.ShowYesNoMsg(prompt) == DialogResult.No)
                return;

       
            //将照片转换为byte[]
            Byte[] b = FileToBytes(_txtFileName.Text);          

            #region todo 将Byte[] 通过webservice上传服务器,在此请加入自己代码
           // CommandAndTaskIdObj commandObj = _form.CommandAndTaskIdObj;
            //WsRmsg msg = Global.GetService().UpFile(commandObj.UserName, commandObj.CommandId ,commandObj.TaskId , b, _txtFileName.Text);
            //if (msg.Flag == 0)
            //{          
            //    b = null;
            //    throw new Exception(msg.Emsg);
            //}
            #endregion

            Global.ShowMsg("照片上传成功");
     
          
            _txtFileName.Text = string.Empty;          
            b = null;           
           
        }
        #endregion

        static byte[] FileToBytes(string sFilePath)
        {
            FileStream inFile = null;             
            try
            {
                byte[] binaryData;
                inFile = new FileStream(sFilePath, FileMode.Open, FileAccess.Read);
                binaryData = new Byte[inFile.Length];
                long bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length);
                return binaryData;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (inFile != null)
                {
                    inFile.Close();
                    inFile.Dispose();
                }
                inFile = null;
            }
        }

        internal void PhotoDispose()
        {
            throw new NotImplementedException();
        }
    }

    public  class ImageChangedArgs : EventArgs, IDisposable
    {
        private Bitmap image;
        /// <summary>
        /// used to create the thumbnail
        /// </summary>
        private Stream stream;
        public ImageChangedArgs(string imageFilePath)
        {

            try
            {
                this.stream =   new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
                this.image = new Bitmap(this.stream);
            }
            catch(Exception ex)
            {
                this.image = null;
                if (this.stream != null)
                {
                    this.stream.Close();
                    this.stream = null;
                }
            }
        }

        public Bitmap Image
        {
            get
            {
                return this.image;
            }
        }

        public Stream Stream
        {
            get
            {
                return this.stream;
            }
        }

        #region IDisposable Members

        public void Dispose()
        {
            if (this.image != null)
                this.image.Dispose();
            this.image = null;
            if (this.stream != null)
            {
                this.stream.Close();
                this.stream.Dispose();
            }
            this.stream = null;
        }

        #endregion
    }

从上个例子可以看出,MemoryStream类基本上被FileStream替代。

当加载大的图片时,只要内存允许,就不会报Exception异常 

时间: 2024-09-17 04:26:53

解决asp.net中CF 3.5 Bitmap(Stream)未处理异常问题的相关文章

绝对酷,如何解决asp.net中javascript脚本的问题(使用服务器控件执行客户端脚本)

论坛中很多人问如何在asp.net中新开一个没有工具栏等等的窗口,大家都说用javascript解决,不错这件事实可以解决了,但是使用通用html control但是就不能用asp.net代码操作他了现在我就为大家解决这个难题. 创建一个窗口新开一个窗口的程序我向大家一定非常熟悉了,简单说一下window.open(url, [name], [features])url是要打开窗口的地址name是新开窗口的名称features是新开窗口的一些属性,例如尺寸等 打开窗口利用服务器属性最简单的把客户

如何解决ASP.net中的刷新按钮问题和URL中的SQL注入问题。

asp.net|按钮|解决|刷新|问题     一直以来,ASP,PHP对处理提交数据时都是传到另一页面处理的,因为本页里处理判断到底是那个按钮得花费大量的精力.这样一来会使得实现一个小小的功能而文件很多,同时好处时不用考虑提交表单或删除数据时的重复提交.    asp.net的推出使得这个问题发生了相反的变化,asp.net的事件和事件委托,程序能够轻松地知道用户是点击了那个按钮,并进行相应的处理.问题就这样了出来了,页面刷新操作是浏览器内部的一种操作,因为浏览器不会为事件或回调发出任何外部通

绝对酷,如何解决asp.net中&amp;#106avascript脚本的问题(使用服务器控件执行客户端脚本)

asp.net|服务器|脚本|解决|客户端|控件|问题|执行 论坛中很多人问如何在asp.net中新开一个没有工具栏等等的窗口,大家都说用javascript解决,不错这件事实可以解决了,但是使用通用html control但是就不能用asp.net代码操作他了现在我就为大家解决这个难题. 创建一个窗口新开一个窗口的程序我向大家一定非常熟悉了,简单说一下window.open(url, [name], [features])url是要打开窗口的地址name是新开窗口的名称features是新开窗

如何解决ASP.net中的刷新按钮问题和URL中的SQL注入问题

asp.net|按钮|解决|刷新|问题 一直以来,ASP,PHP对处理提交数据时都是传到另一页面处理的,因为本页里处理判断到底是那个按钮得花费大量的精力.这样一来会使得实现一个小小的功能而文件很多,同时好处时不用考虑提交表单或删除数据时的重复提交.    asp.net的推出使得这个问题发生了相反的变化,asp.net的事件和事件委托,程序能够轻松地知道用户是点击了那个按钮,并进行相应的处理.问题就这样了出来了,页面刷新操作是浏览器内部的一种操作,因为浏览器不会为事件或回调发出任何外部通知.程序

解决ASP.NET中的各种乱码问题

原文 http://www.cnblogs.com/fish-li/archive/2012/10/14/2723631.html 阅读目录 开始 页面显示乱码问题 AJAX提交的数据乱码问题 JavaScript中正确的URL编码方式 ASP.NET中正确的URL编码方式 正确的URL编码方式的总结 彻底解决encodeURIComponent()与GB2312乱码问题 Cookie乱码问题 下载文件名乱码问题 多语言数据的乱码问题 乱码问题的总结 经常发现有人被乱码困扰着,而我感觉比较幸运,

解决ASP.NET中的各种乱码问题总结_实用技巧

经常发现有人被乱码困扰着,而我感觉比较幸运,很少为此烦恼过. 在这篇博客中,我将把我想到的一些与乱码有关的经验总结出来,供大家参考. 页面显示乱码问题 在一个网站中,有些页面会正常显示,然而,有些页面会显示成乱码. 如果发生这种情况,可以检查一下web.config和文件编码. 如果web.config是这样配置的: <globalization fileEncoding="utf-8" /> 而文件的编码不是UTF-8: 那么就会有乱码问题. 注意:反之是不是会出现乱码的

解决ASP.NET中&quot;/&quot;应用程序中的服务器错误的方法_实用技巧

 学习asp.net中讲解验证控件问题时,我的程序运行时总是提示这样的问题:"/"应用程序中的服务器错误.如下图:     从网上找到了相关的方法:  在webconfig中找到 <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> <addkey="ValidationSettings:U

解决 ASP.NET 中目录访问权限的问题

asp.net|访问|解决|问题 症状:从 ASP.NET 应用程序,访问远程增强安全性的资源时可能会收到以下错误信息      登录失败:未知用户名或错误密码. 解决办法:      1   在 Web 服务器上修改 ASPNET 帐户的密码为 password .      2   在远程文件服务器上,修改 ASPNET 帐户(如果没有该帐户则创建之)的密码为 password .      3   在远程文件服务器上,为 ASPNET 帐户设置相应目录的访问权限.      4   修改

解决ASP.NET中目录访问权限的问题

症状:从 ASP.NET 应用程序,访问远程增强安全性的资源时可能会收到以下错误信息 登录失败:未知用户名或错误密码. 解决办法: 1 在 Web 服务器上修改 ASPNET 帐户的密码为 password . 2 在远程文件服务器上,修改 ASPNET 帐户(如果没有该帐户则创建之)的密码为 password . 3 在远程文件服务器上,为 ASPNET 帐户设置相应目录的访问权限. 4 修改 Web.config 文件,在 配置节中添加: <identity impersonate="