Silverlight CRM 2011中异步线程之间的同步

时间:2013-09-23 13:59:50

标签: silverlight silverlight-4.0 dynamics-crm-2011 dynamics-crm silverlight-5.0

我正在使用silverlight应用程序来开发webresource。我正在使用ServiceProxy.BeginExecute方法,这是Asynch操作但是。现在我处于这样一种情况,我需要调用一个方法A,它在内部调用调用CRM服务的Beginexecute的方法B,在该方法中,它给Delegate在完成BeginExecute方法时执行。现在因为BeginExecute方法是Asynch我的主线程在响应回来之前返回。我想保持主线程,直到BeginExecute compltes。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

虽然通常不建议在Synchronous fasion中调用Web服务,但也有例外。这并不容易,但有几种方法可以做到这一点:SynchronousSilverlight

你基本上必须编写自己的ChannelFactory。

答案 1 :(得分:0)

我们在CRM Silverlight开发中使用Microsoft的反应框架。我们只使用了它的一小部分,但我们所做的是将我们称为IO的所有函数称为IObservable,然后订阅它以监听结果。很酷的是你可以将多个事件链接在一起并订阅最终结果,这样它就会等到完成所有事件。

以下是简单调用的示例

public static IObservable<ProductGroup> RetrieveProductGroupByProductID(IOrganizationService service, Guid productID)
        {
            var res = RXCRMMethods.Retrieve(service, "product", productID, new ColumnSet() { Columns = new ObservableCollection<string> { "py3_productgroup" } });

            return Observable.Create<ProductGroup>(observer =>
            {
                try
                {
                    res.Subscribe(e =>
                    {
                        ProductGroup pg = new ProductGroup 
                        { 
                            ProductGroupId = e.GetAttributeValue<EntityReference>("py3_productgroup").Id
                        };
                        observer.OnNext(pg);
                    },
                        ex =>
                        {
                            observer.OnError(ex);
                        });
                }
                catch (Exception ex)
                {
                    observer.OnError(ex);
                }
                return () => { };
            });

        }

以下是如何订阅多个电话

var LoadQRY = from MatExResult in MaterialExclusionsFactory.GetMaterialExclusionsForOpportunity(this.Config.CrmService, this.OpportunityID)
                                  from result in QuoteLineItemFactory.RetrieveQuoteLineItems(Config.CrmService, this)
                                  from crateResult in QuotePackingCrateFactory.GetOneOffCratesForQuote(this.Config.CrmService, this.QuoteId)
                                  from StaticResult in QuoteLineItemFactory.RetrieveStaticQuoteLineTypes(this.Config.CrmService,this)
                                  select new {  MatExResult,result,crateResult,StaticResult };

                    LoadQRY.Subscribe(LoadResult =>
                        {
                           //Do something
                         },ex=>
                         {
                             //Catch errors here
                        });