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

这几天使用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在第一句返回的时候就执行了,不知道有没有人遇到这个问题并解决了?

 

posted @ 2010-07-19 15:34  yycanton  阅读(1856)  评论(1)    收藏  举报