WebClient 同步阻塞失效 问题

sjhcsdn 2013-07-26 01:58:23
        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 全部会因为主线程的手动 等待而 不执行(即死锁)

求解决方案 ~
...全文
323 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjhcsdn 2013-07-26
  • 打赏
  • 举报
回复
不行~~~~~
  • 打赏
  • 举报
回复
不要阻塞。从设计的“根源”上,就应该改为回调形式。
icegrue 2013-07-26
  • 打赏
  • 举报
回复
手上没有可试的环境,你试试这样行不: 那个DownloadCompleted 是下载完成时的事件吧?

        public static void LoadContentByXap(string xapname,Action<object> done) {
            var x = new DeploymentCatalog(xapname);
            x.DownloadCompleted += (o, k) => {
                done.Invoke(x.Parts);
				are.set();
            };
            x.DownloadAsync();
			are.WaitOne();
        }
        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);
                Interlocked.Exchange(ref mark, 0);                
                Ex.LoadContentByXap(dllname+".xap",(object x) => {
                    currentbag = x as IPageBag;
                    Interlocked.Exchange(ref mark, 1);
                });
                CheckBag(currentbag, ref bag);
            }
        }
sjhcsdn 2013-07-26
  • 打赏
  • 举报
回复
如1楼所示,在使用属性 比如 Bag1,或Bag2时,如果它们为空那么就去 下载并加载它们(远程异步的方式)但是在手动阻塞主线程以试图 等待它们的异步返回结果时 却遭遇了 死锁 求方案,叩谢!
sjhcsdn 2013-07-26
  • 打赏
  • 举报
回复
如1楼所示,在使用属性 比如 Bag1,或Bag2时,如果它们为空那么就去 下载并加载它们(远程异步的方式)但是在手动阻塞主线程以试图 等于它们的异步返回结果时 却遭遇了 死锁 求方案,叩谢!
sjhcsdn 2013-07-26
  • 打赏
  • 举报
回复
        public IPageBag Bag2 {
            get {
                LoadMudel("Bag5", ref bag2);
                return bag2;
            }
        }

        public IPageBag Bag1 {
            get {
                LoadMudel("Bag4", ref bag1);
                return bag1;
            }
        }

8,735

社区成员

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

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