ASP.NET AJAX Futures January CTP中的一个Bug

本文探讨了ASP.NET AJAX早期版本中XML绑定技术的一个核心Bug,并提供了详细的代码修改建议,确保无论源或目标对象失效时都能妥善处理。

还是比较喜欢ASP.NET AJAX早期版本中出现的xml绑定技术,这部分功能在正式版中虽然被移除了,但是在微软放出的CTP版本中依然存在,而且内部结构发生了很大的变化,唯一庆幸的是xml绑定的语法基本上没有变化,所以一直在研究这个版本。

首先说一下这个版本的优点,给我感觉最好的就是兼容主流浏览器,我用IE7、FireFox1.5.10和Opera9.10测试过,xml绑定都能够正常工作,看来微软还是下了一番功夫的。

但是,在这个版本中,实现xml绑定的核心Sys.Preview.Binding类中有个致命的Bug,会导致在某些情况下绑定出错。先看一下Sys.Preview.Binding.initialize的源代码:

function Sys$Preview$Binding$initialize() {
   Sys.Preview.Binding.callBaseMethod(this, 'initialize');

   if (this.get_automatic()) {
      if (this._direction !== Sys.Preview.BindingDirection.In) {
         var target = this.get_target();
         if (Sys.INotifyPropertyChange.isImplementedBy(target)) {
            this._targetNotificationHandler = Function.createDelegate(this, this._onTargetPropertyChanged);
            target.add_propertyChanged(this._targetNotificationHandler);
         }
         // 问题出现在这里,当direction不等于In,也就是Out或者InOut时,
         // 当target死掉时通知绑定target已经死掉,
         // 但是,如果Source死掉呢?怎么办?不知道。
         if (Sys.INotifyDisposing.isImplementedBy(target)) {
            this._targetDisposingHandler = Function.createDelegate(this, this._onDisposing);
            target.add_disposing(this._targetDisposingHandler);
         }
      }

      if (this._direction !== Sys.Preview.BindingDirection.Out) {
         var source = this._getSource();
         if (Sys.INotifyPropertyChange.isImplementedBy(source)) {
            this._sourceNotificationHandler = Function.createDelegate(this, this._onSourcePropertyChanged);
            source.add_propertyChanged(this._sourceNotificationHandler);
         }
         // 这里犯有同样的错误,当direction不等于Out,也就是In或者InOut时,
         // source死掉时会通知绑定source已死,
         // 但是却没有考虑让target死掉时也通知binding
         if (Sys.INotifyDisposing.isImplementedBy(source)) {
            this._sourceDisposingHandler = Function.createDelegate(this, this._onDisposing);
            source.add_disposing(this._sourceDisposingHandler);
         }

         this.evaluate(Sys.Preview.BindingDirection.In);
      }
   }
}

既然是绑定,那个就应该不管是source还是target任意一方死掉时,都应该通知绑定,自己将死,让绑定做好善后工作,以上代码只要稍微修改一下,就可以正常工作了。

要改写这个方法,我们需要重写这个方法,修改好的代码如下:

Sys.Preview.Binding.prototype.initialize = function() {
   Sys.Preview.Binding.callBaseMethod(this, 'initialize');
   if (this.get_automatic()) {
      var target = this.get_target();
      var source = this._getSource();
      if (this._direction !== Sys.Preview.BindingDirection.In) {
         if (Sys.INotifyPropertyChange.isImplementedBy(target)) {
            this._targetNotificationHandler = Function.createDelegate(this, this._onTargetPropertyChanged);
            target.add_propertyChanged(this._targetNotificationHandler);
         }
      }

      if (this._direction !== Sys.Preview.BindingDirection.Out) {
         if (Sys.INotifyPropertyChange.isImplementedBy(source)) {
            this._sourceNotificationHandler = Function.createDelegate(this, this._onSourcePropertyChanged);
            source.add_propertyChanged(this._sourceNotificationHandler);
         }

         this.evaluate(Sys.Preview.BindingDirection.In);
      }
      // 不管绑定的方向,不管target和source那个死掉,都要通知绑定,做好善后工作。
      if (Sys.INotifyDisposing.isImplementedBy(target)) {
         this._targetDisposingHandler = Function.createDelegate(this, this._onDisposing);
         target.add_disposing(this._targetDisposingHandler);
      }
      if (Sys.INotifyDisposing.isImplementedBy(source)) {
         this._sourceDisposingHandler = Function.createDelegate(this, this._onDisposing);
         source.add_disposing(this._sourceDisposingHandler);
      }
   }
}
不知道我的理解是否正确,随后,我会附上一个Demo的项目,来演示这个Bug。

张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/

本文转自张志敏博客园博客,原文链接:http://www.cnblogs.com/beginor/archive/2007/03/17/678282.html ,如需转载请自行联系原作者
一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值