您的位置:首页 > 其它

在SilverLight中同步调用调用wcf服务

2010-07-19 15:34 357 查看
这几天使用SilverLight调用ironpython遇到了一些问题,后来在codeplex网站上找到了解决方案

是这样的,在Silverlight脚本系统中调用的脚本有些使用到了wcf,而脚本之间调用在数据上是有先后依赖关系的,比如:

def doSomething:

obj1 = context.Load("From Obj1") #context是C#注册到ironpython中的对象,Load使用了wcf服务下载服务端数据

#加载obj2

obj2 = context.Load("From Obj2 Where Obj2.RefID="+obj1.ID)

问题出现在这里了,由于Silverlight调用wcf是异步调用,所以从效果上来说,加载obj2的语句不会等到obj1加载完成就会执行,如此导致加载obj2的失败

后来在http://www.codeproject.com/KB/silverlight/SynchronousSilverlight.aspx找到了解决办法

利用后台线程来同步返回,关键是使用ManualEvent的信号量,并且不允许在UI线程当中使用

例如:

void Load()

{

System.Threading.ThreadPool.QueueUserWorkItem(delegate
{

      ManualResetEvent manualEvent = new ManualResetEvent(false);

AccessWCFService(manualEvent);

manualEvent.WaitOne(20000);//等待20秒

    })

}

string AccessWCFService(ManualResetEvent manualEvent )

{

..... 使用链接地址所用方式,同步方式访问wcf服务

manualEvent.set();

}

这个可以保证多个wcf服务在非UI线程顺序访问,不过问题来了,在IronPython写上述doSomething的时候,是一次加载一次运行的,这样导致第二句Script在第一句返回的时候就执行了,不知道有没有人遇到这个问题并解决了?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: