public static void LoadContentByXap(string xapname,Action<object> done) {
var x = new DeploymentCatalog(xapname);
x.DownloadCompleted += (o, k) => {
done.Invoke(x.Parts);
};
x.DownloadAsync();
}
public static void LoadContentByXap(string xapname, string frameworkelementpath, Action<dynamic> carryback) {
var wc = new WebClient();
wc.OpenReadCompleted += (s, e) => {
var vv = new StreamResourceInfo(e.Result, "application/binary");
AssemblyPart ap = new AssemblyPart();
var assembly = ap.Load(Application.GetResourceStream(vv, new Uri(xapname + ".dll", UriKind.Relative)).Stream);
var content = assembly.CreateInstance(xapname + "." + frameworkelementpath);
if (carryback != null) {
carryback.Invoke(content);
}
};
wc.OpenReadAsync(new Uri(xapname + ".xap", UriKind.Relative));
}
void CheckBag(IPageBag bag, ref IPageBag bag2) {
//while (mark != 1) {
// Thread.Sleep(100);
//}
//Interlocked.Exchange(ref mark, 0);
//are.WaitOne();
bag2 = bag;
}
public void LoadMudel(string dllname, ref IPageBag bag) {
if (bag == null) {
var currentbag = default(IPageBag);
are.Reset();
Interlocked.Exchange(ref mark, 0);
Ex.LoadContentByXap(dllname+".xap",(object x) => {
currentbag = x as IPageBag;
are.Set();
Interlocked.Exchange(ref mark, 1);
});
CheckBag(currentbag, ref bag);
}
}
上面这个是silverlight 异步请求一个对象 然后手动同步阻塞的 代码,但可悲的是,同步阻塞造成了死锁
WebClient 对 OpenReadCompleted 或DeploymentCatalog的DeploymentCatalog 全部会因为主线程的手动 等待而 不执行(即死锁)
求解决方案 ~