在异步加载图片的时候发现的问题,因为要加载很多不同的图片,每次加载一个都要new一个Downloader,结果发现句柄数一直不停地往上冒。后来写了个简单的测试程序,发现每次new一个Downloader,就会增加三个句柄左右,但并不回收。后来改变个方式,重复使用同一个Downloader,发现句柄数在增加一次后就一直不变了。看来和以前说的Silverlight内存回收属于一样的问题,现在就只能使用方法绕过去了,尽量重复使用Downloader,不要new新的Downloader。
比如使用一个Downloader池,一个简单的Downloader Pool应该有两个List和两个方法,两个List分别用来管理工作中的Downloader和空闲的Downloader,一个方法用来提供空闲的Downloader,另外一个方法用来回收已经用完的Downloader。注意,若使用下面的这种代码,需要在回收Downloader时同时去掉Downloader上所附加的托管事件(使用“-=”操作符),你也可以把Downloader的事件封装在这个Downloader Pool类里面~
public class DownloaderPool
{
……
……
private List<Downloader> IdleDownloader = new List<Downloader>();
private List<Downloader> BusyDownloader = new List<Downloader>(...
写了个程序,由于动态New出来的对象比较多,被发现有少量的内存泄露问题。仔细找了好几圈,确认所有引用都被释放了,但问题依然存在。后来仔细观察发现,即使是一个简单的按钮事件:鼠标移进去变色,移出来恢复原来的颜色,这样的情况下内存也会持续增长,尽管增长幅度不尽相同。
于是写了个简单的测试程序,有两个按钮:点击Add按钮,动态new出8000个Ellipse,大小为10*10,半透明;点击Delete按钮,从界面上移除这8000个Ellipse,使用Children.Clear()方法。经测试发现,每次Add以后,再Delete,内存只有极少量的回收(估计是从界面渲染上回收的),而每次Add之后内存增长都在10兆到20兆。测试代码如下:
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
addNew.MouseLeftButtonUp += new MouseEventHandler(addNew_MouseLeftButtonUp);
delAll.MouseLeftButtonUp += new MouseEventHandler(delAll_MouseLeftButtonUp);
}
其实这个问题也不是我先发现的。一个月以前,做了个东西,有人用着用着问我为什么出现这样的情况:横着改变窗口大小的时候,视频大小会跟着改变而且会保持居中,播放控制栏的位置也会跟着改变(保持底部水平居中),但是垂直改变窗口的大小时,视频大小和位置都不变,播放控制栏的位置也不变。后来发现这个可能是BrowserHost.Resize的一个bug:垂直方向改变窗口大小时不会触发这个事件,不过我只测试了IE6和IE7下的情况,Firefox尚未测试。
不知道有木有人报告这个bug……
2007-12
在Silverlight 1.0的SDK中说L和l是一样的,没有说有什么差别,今天偶然发现大写的L命令和小写的l命令是有区别的,后来依次测试V和v、H和h、A和a、C和c、Q和q等一系列命令都存在同样的区别。
一个简单的示例如下:
<Path Stroke="Blue" Data="M 40,20 V 50 H 50 l 60,60" />
<Path Stroke="Red" Data="M 40,20 V 50 h 50 l 60,60" Canvas.Top="100" />
如果没有区别,这两条折线的形状应该是一模一样的,而实际上它们是这样的:

MS动作还是挺快的,要不然赶不上这互联网RIA的快车了。
Blend 2 Dec. Preview新特性:
Visual Studio 2008 support
Silverlight Support
Synchronized File Changes
Making Controls from Existing Objects
Split View and XAML Editor Improvements
Storyboard Picker
Storyboard and Keyframe Properties
Key Spline Editor
Vertex Animation
Clip Path Editing and Animating
Breadcrumb Bar
Font Embedding ...
2007-11
从ScottGu's Blog上看到这样一篇文章:.NET Web Product Roadmap (ASP.NET, Silverlight, IIS7)
文中提到Silverlight将在2008年第一季度发布2.0 Beta版,同时也会发布Silverlight 2.0 Tools for Visual Studio 2008,能够用于VS 2008标准版(Standard)、专业版(Professional)以及Express版。
从Silverlight 1.1到Silverlight 2.0,必将供许多新的功能,其中有很多是期待已久的。这些功能包括:
- WPF UI框架支持
包括可扩展的控件框架muban、布局管理支持、双向数据绑定、以及控件模板和皮肤支持。
- 丰富的控件
终于不用那么麻烦了,在Silverlight中将包括许多新的控件,包括:核心表单控件(textbox、checkbox、radiobutton等)、内建布局管理控件(StackPannel、Grid等)、常用功能控件(TabControl、Slider、ScrollViewer、ProgressBar等),以及数据操作控件(如DataGrid等)...
2007-11
昨天说Silverlight User Control不能接收键盘消息,但是Page.xaml是可以接收键盘消息。既然Page能够接收键盘消息,那么我们就可以用Page来接收消息,然后想办法转发给User Control页面就行了。一个简单的实现方法就是利用C#中的delegate来实现。
简单的例子如下:
1、先在Page.xaml.cs中声明一个delegate类型以及一个该类型的变量,其参数和KeyboardEventHandler的参数一样,这样就可以直接把事件传过去了;
public delegate void SubKeyBoardEventHandler(object sender, KeyboardEventArgs e);
public SubKeyBoardEventHandler subKeyHandler = null;
2、在Page.xaml.cs中监听键盘消息:
this.KeyDown += new KeyboardEventHandler(Page_KeyDown);
3、这个键盘事件Handler要写成这样...
2007-11
Page.xaml里面的元素是可以接收键盘事件的,本来以为User Control页面也支持键盘事件的,结果在User Control的页面里加上了一行这样的代码:
this.KeyDown += new KeyboardEventHandler(UC_KeyDown);
当加载这个User Control时,发现这个User Control就显示不出来了,而注释掉就可以正常显示。后来试着在Page.xaml.cs里写这样的代码:
UC uc = new UC();
uc.KeyDown += new KeyboardEventHandler(uc_KeyDown);
this.Children.Add(uc);
发现还是无法显示出来,而注释掉那一行KeyDown事件就没有什么问题,莫非Silverlight User Control真的不支持键盘事件?
Processed in 0.1093764 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号
2007-12
用户中心
日志分类

最新日志
最新评论
统计信息






友情链接