我正在使用 Silverlight 应用程序来开发网络资源。我在其中使用的是异步操作的 ServiceProxy.BeginExecute 方法。现在我处于需要调用方法 A 的情况,该方法在内部调用方法 B,该方法调用 CRM 服务的 Beginexecute,在该方法中,当完成 BeginExecute 方法时,它让委托执行。现在因为 BeginExecute 方法是异步的,所以我的主线程在响应返回之前返回。我想保持主线程直到 BeginExecute 完成。
我该怎么做?
我正在使用 Silverlight 应用程序来开发网络资源。我在其中使用的是异步操作的 ServiceProxy.BeginExecute 方法。现在我处于需要调用方法 A 的情况,该方法在内部调用方法 B,该方法调用 CRM 服务的 Beginexecute,在该方法中,当完成 BeginExecute 方法时,它让委托执行。现在因为 BeginExecute 方法是异步的,所以我的主线程在响应返回之前返回。我想保持主线程直到 BeginExecute 完成。
我该怎么做?
我们在 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
});
虽然通常不建议以同步方式调用 Web 服务,但也有例外。这并不容易,但有几种方法可以做到这一点:SynchronousSilverlight
您基本上必须编写自己的 ChannelFactory。