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