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

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

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

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

1 WebClient wc = new WebClient();

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

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

 

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

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);

错误信息如下:

{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)}

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



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

作者: 羽之 发表于 2011-04-27 18:14 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架