关于Silverlight动态加载的疑问

Pegasuscc 2011-04-28 11:26:04
最近在搞sl的项目,正好用到动态加载,就找了一下。发现网上基本上都是用webClient下载,之后异步加载。

当然了SL只能异步加载,但是我使用了压力测试的情况下发现,事情没有这么简单。

首先MSDN上明确指定这个异步加载的方式,在不阻止调用线程的情况下.

之后好玩的事出来了,首先是在webclient下载前线程为1


WebClient wc = new WebClient();
wc.OpenReadCompleted += infoDownloader_Completed;
wc.OpenReadAsync(new Uri(msg.NameSpace, UriKind.Relative));

之后到了infoDownloader_Completed时,线程数变了,改为7

void infoDownloader_Completed(object sender, OpenReadCompletedEventArgs e)
{
try
{
if (e.Error == null)
{
AssemblyPart _part = new AssemblyPart();
Assembly assembly = _part.Load(e.Result); //导入程序集名称
Type cls = assembly.GetType(_msg.ClassName, true);





重点来了,这时new AssemblyPart报错了,


错误信息如下:


{System.UnauthorizedAccessException: 跨线程访问无效。 位于 MS.Internal.XcpImports.CheckThread() 位于 System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO) 位于 System.Windows.AssemblyPart..ctor() 位于 ClientSocket.InvokeReflection.infoDownloader_Completed(Object sender, DownloaderEventArgs e)}

虽然这个问题,我还没有解决,但希望在此提醒大家,异步加载的风险。




好了,最后拜托大家帮我想个解决方案,不吝赐教!!


...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jv9 2011-04-30
  • 打赏
  • 举报
回复
一个WebClient异步请求,infoDownloader_Completed是在客户端当前进程请求完成后响应的,而同时在下一个请求到来时,服务器端生成新的线程处理infoDownloader_Completed请求。 这是异步服务请求最基本的实现,无论是WebClient还是WCF都是这样的流程。

解决该问题可以考虑使用 Dispatcher.BeginInvoke。
Pegasuscc 2011-04-30
  • 打赏
  • 举报
回复
问题解决。

参考了此文章
http://blog.csdn.net/banmuhuangci/archive/2009/05/13/4176870.aspx

主要是在socket创建时使用SynchronizationContext,来同步上下文,之后用此类的实例来post我要执行的方法,就OK了。

问题是我没有搞清楚多线程处理时,线程同步的问题,现在明白了。

多谢各位了,特别是冷秋寒。我是你微博的粉丝啊。支持银光。
Pegasuscc 2011-04-30
  • 打赏
  • 举报
回复
这里不涉及UI线程的控件,Dispatcher.BeginInvoke只能在UI控件使用
helloWorld1209 2011-04-28
  • 打赏
  • 举报
回复
infoDownloader_Completed 我感觉应该是 1 ,主线程去掉用的

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧