0

我正在使用 Silverlight 应用程序来开发网络资源。我在其中使用的是异步操作的 ServiceProxy.BeginExecute 方法。现在我处于需要调用方法 A 的情况,该方法在内部调用方法 B,该方法调用 CRM 服务的 Beginexecute,在该方法中,当完成 BeginExecute 方法时,它让委托执行。现在因为 BeginExecute 方法是异步的,所以我的主线程在响应返回之前返回。我想保持主线程直到 BeginExecute 完成。

我该怎么做?

4

2 回答 2

0

我们在 CRM Silverlight 开发中使用 Microsoft 的响应式框架。我们只使用其中的一小部分,但我们所做的是将调用 CRM 的所有函数都设为 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
                        });
于 2013-09-27T07:09:45.187 回答
0

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

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

于 2013-09-24T18:10:36.257 回答