关于silverlight 页面跳转时,未执行完的WCF方法

深海之蓝 2013-01-23 10:34:32
大家好,我在开发过程中遇到这样一个问题:
我的程序是左右结构的,左边是导航菜单,右边是对应的导航页面,导航页面用的是silverlight page,当左边的导航菜单选中不同的内容时,右边切换对应的 page。现在的问题是,如果我在A页面中的一个wcf方法在未执行完的情况下就切换到B页面,A页面中的方法并不会就此终止,而是会继续执行。如果B页面中也有一个执行时间比较长的wcf方法,我在B页面wcf未执行晚的情况下再去跳转到A页面,反复几次后,就会报错。
我感觉这种情况应该比较常见,但在网上搜索没找到比较好的解决办法,我在page_unloaded方法中 加入对应服务的 CloseAsync()方法,依然是报错,试了其他几个搜到的办法,也不行。我感觉应该有那种类似Cancelxxx()的方法,就是直接终止还未执行完的方法,但是智能提示里边也没有。
请问大家,这样的情况该如何处理?多谢了!
...全文
353 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yajiedesign 2013-02-21
  • 打赏
  • 举报
回复
wcf包含了网络通信,经常出错的.你只要屏蔽掉就好,再加上一定的重试机制. 建议把wcf用个单例封装起来.吧wcf错误处理和重试集中起来,因为是单例,也可避免切换页面时,反复创建wcf对象.
jv9 2013-02-01
  • 打赏
  • 举报
回复
推荐楼主阅读这篇文章,其中一些方法和你的问题类似:http://blogs.msdn.com/b/webapps/archive/2013/01/24/out-of-memory-issue-when-silverlight-application-talks-to-wcf-service-using-system-net-socket-via-duplex-channel.aspx
深海之蓝 2013-01-26
  • 打赏
  • 举报
回复
后来又改成 if (ServiceClient != null) { try { ServiceClient.CloseAsync(); } catch (Exception) { ServiceClient.Abort(); } } 这样在连续切换几次后,会报错: 无法访问已释放的对象。 请版主帮忙再看看,多谢了!
深海之蓝 2013-01-26
  • 打赏
  • 举报
回复
引用 5 楼 jv9 的回复:
取消WCF服务,可以使用abort,代码比较简单: private void buttonAbort_Click(object sender, EventArgs e) { if( m_client != null ) m_client.Abort(); } 在页面切换前,都可以设置abort,如果存在service没有……
多谢版主,加上了abort之后 还是报错 错误内容为: 对“http://localhost/xxx.svc”的 HTTP 请求被中止。这可能是由于请求仍在进行时本地通道正被关闭造成的。如果这不是所需的行为,请更新代码,以便在执行请求操作期间代码不会关闭通道。 我是在页面的 page_unloaded事件中 加入的 abort方法,加了断点跟踪了一下,走到 abort方法中了,但是走完page_unloaded 方法后 vs提示 无源可用,没法再继续走下去了。然后 f5了,就报错了。 请问这样的情况该如何处理啊?多谢了!
深海之蓝 2013-01-26
  • 打赏
  • 举报
回复
引用 9 楼 jv9 的回复:
引用 7 楼 llwinnner 的回复: 后来又改成 if (ServiceClient != null) { try { ServiceClient.CloseAsync(); } ……
嗯,这个确实有问题,不会走到 abort里边。
深海之蓝 2013-01-26
  • 打赏
  • 举报
回复
引用 8 楼 jv9 的回复:
引用 6 楼 llwinnner 的回复: 引用 5 楼 jv9 的回复:取消WCF服务,可以使用abort,代码比较简单: private void buttonAbort_Click(object sender, EventArgs e) { if( m_client != null ) m_client.Abort(); ……
多谢版主,那请问,我这种需求:在页面跳转的时候,未执行完的wcf方法就终止了,abort方法是应该放在 page_unloaded事件内吗?如果是放在该事件内,您说的:需要服务response,如果服务不存在,会提示异常。 需要如何做才能正常终止呢?
jv9 2013-01-26
  • 打赏
  • 举报
回复
引用 7 楼 llwinnner 的回复:
后来又改成 if (ServiceClient != null) { try { ServiceClient.CloseAsync(); } c……
这样可以正常关闭连接么?还是出现异常后,abort服务?在哪里调用的?
jv9 2013-01-26
  • 打赏
  • 举报
回复
引用 6 楼 llwinnner 的回复:
引用 5 楼 jv9 的回复:取消WCF服务,可以使用abort,代码比较简单: private void buttonAbort_Click(object sender, EventArgs e) { if( m_client != null ) m_client.Abort(); } 在页面……
page_unloaded事件触发后会销毁页面对象以及服务进程,而abort需要服务response,如果服务不存在,会提示异常。
深海之蓝 2013-01-26
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
引用 楼主 llwinnner 的回复:如果B页面中也有一个执行时间比较长的wcf方法,我在B页面wcf未执行晚的情况下再去跳转到A页面,反复几次后,就会报错。 你应该对这个进行仔细分析,了解为什么会“报错”,看看出错的机制是什么原因、你需要屏蔽哪一种类型的错误,等等。 你完全是跑到岔路上去了。
你好,多谢回复,出错是在代理类中出错,反复切换报超时错误。之前的操作都没有取消,而是都累加起来的,出错的原因应该就是多次这样的查询累加造成的,所以想取消未执行完的方法。应该该属于服务端错误,请问要屏蔽类似的错误是要在代理类中添加try catch 吗?如果这样的话,我更新一次引用,就要重新添加try catch了。
  • 打赏
  • 举报
回复
引用 楼主 llwinnner 的回复:
如果B页面中也有一个执行时间比较长的wcf方法,我在B页面wcf未执行晚的情况下再去跳转到A页面,反复几次后,就会报错。
你应该对这个进行仔细分析,了解为什么会“报错”,看看出错的机制是什么原因、你需要屏蔽哪一种类型的错误,等等。 你完全是跑到岔路上去了。
  • 打赏
  • 举报
回复
我跟你说一个基本观念。 当我们进行大量异步操作时,我们其实无法阻止经常抛出各种异常的情况。许多异常是我们在同步、简单、顺序编程时所没有想象到的。我们将顺序操作下的程序测试得非常好,这往往就够了。对于必定会在异步随机胡乱操作下出现的异常,只能用务实的容错设计去处理。 不要过分技术化。不要追求什么“不抛出异常”的结果。
  • 打赏
  • 举报
回复
引用 楼主 llwinnner 的回复:
我的程序是左右结构的,左边是导航菜单,右边是对应的导航页面,导航页面用的是silverlight page,当左边的导航菜单选中不同的内容时,右边切换对应的 page。现在的问题是,如果我在A页面中的一个wcf方法在未执行完的情况下就切换到B页面,A页面中的方法并不会就此终止,而是会继续执行。如果B页面中也有一个执行时间比较长的wcf方法,我在B页面wcf未执行晚的情况下再去跳转到A页面,反复几次后,就会报错。 我感觉这种情况应该比较常见,但在网上搜索没找到比较好的解决办法,我在page_unloaded方法中 加入对应服务的 CloseAsync()方法,依然是报错,试了其他几个搜到的办法,也不行。我感觉应该有那种类似Cancelxxx()的方法,就是直接终止还未执行完的方法,但是智能提示里边也没有。
具体是报什么错? 要知道,web软件应用时的可能随时被用户“折腾”,因此抛出异常在所难免。这个要以测试为准,假设说数据有问题那么必须解决数据错误问题,假设数据没有问题那么你使用try...catch在表现层将特定的异常屏蔽掉就行了。要知道,必定会出现异常的。 注意,不要纠缠什么CloseAsync、CancelXXX之类的。没有必要采用的“技术”少去采用。
jv9 2013-01-25
  • 打赏
  • 举报
回复
取消WCF服务,可以使用abort,代码比较简单: private void buttonAbort_Click(object sender, EventArgs e) { if( m_client != null ) m_client.Abort(); } 在页面切换前,都可以设置abort,如果存在service没有完成,api会强制停止。 如果你在使用abort出现错误,首先debug确认是否调用abort成功,另外确认连接是否会被正常关闭。
在路上20130607 2013-01-24
  • 打赏
  • 举报
回复
什么错误 ?
深海之蓝 2013-01-24
  • 打赏
  • 举报
回复
好像不行,abort 是试过了,还是出错。有没有比较简单的解决办法,感觉上边地址里的太复杂了。
在路上20130607 2013-01-23
  • 打赏
  • 举报
回复
What's the best way to cancel an asynchronous WCF request? 有个判断 状态的地方 也有Abort的方法 没用过wcf 都是网上查的

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧