我有一个调用WCF服务的Silverlight项目。服务方法GetData有一个参数dataID,通过GetDataAsync调用,由具有BeginGetData和EndGetData函数的自动处理类处理。在某些情况下,调用将在EndGetData中抛出一个TimeoutException(这很好,它自己调用某些第三方服务的WCF服务,有时它们可能会关闭或出现问题,所以我不想增加超时值)。 p>
我想要做的是能够使用发送到GetDataAsync的dataID采取行动(例如,安排对GetData的新调用或向用户显示适当的错误消息,指示哪些数据流失败)。如何才能做到这一点? 如果我在EndGetData中设置断点,IAsyncResult类型的结果参数将是一个System.ServiceModel.Channels.ServiceChannel.SendAsyncResult对象,它具有一个RPC属性,我可以在调试时找到该参数,但是这个类不可用于代码因为它被宣布为朋友。
这是完全可能还是有人对如何以另一种方式实现我想要的行为有想法?
答案 0 :(得分:1)
而是实现应该由Visual Studio自动生成的Completed EventHandler。您也可以使用自己的userState值调用。
void GetData(int dataID)
{
client.GetDataCompleted += GetDataCompleted;
client.GetDataAsync(dataID, dataID); //the 2nd param being the userState object
}
void GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
var dataId = (int)e.UserState;
}
如果发生错误,EventArgs也将包含异常:
if (e.Error != null)
throw e.Error;
避免更改/使用自动生成的方法。