如何优雅的解决WebServices的方法调用(长时间),多线程操作窗体的几个问题?
1.问题:
如果需要通过网络调用服务器上的Web Method,而这个方法所需要的操作时间是不确定的(网络状况不同),客户端采用了WinForm技术.请教如何才能优雅的解决这个问题?
2.我目前采用的方案:
客户端通过一个Adapter接管了所有的WebMethod的调用,在每次调用前显示一个有模式的进度窗体(GIF),WebMethod调用返回后关闭进度窗体.
这其中使用了委托的异步调用机制显示进度窗体和关闭窗体.考虑到性能的原因我没有使用同一个窗体(需要Lock),而是采用了每次新创建一个窗体然后把它关闭的办法.现在虽然实现了但是中间有过好多的挫折,感觉整体的路子应该是走错了,请大家赐教!
3.实现过程中的几点疑问:
(1)客户端如果在窗体的Load方法里面调用WebService,有那么几种情况就会出现进度条无法ShowDialog出来(或者是无法关闭掉),后来查询Google发现同样的问题建议写到VisibleChanged事件里面,这样确实可以解决问题,但是不知道具体是什么原因导致的问题以及具体的原理?
(2)可否在窗体创建的时候就把它给关闭掉?因为有的时候服务器很快就返回了结果,这时候如果关闭事件不采用等待窗体创建完成就关闭的话,会提示Cannot call Close() while doing CreateHandle()
(3)其实是第二个问题让我想不通,为什么我在调用关闭窗体的时候判断了this.InvokeRequired还是会出现上面的错误呢?
(4)是使用异步调用(这个是线程池)好呢?还是自己写线程调用好?或者是ThreadPool?
(5)涉及多线程和窗体的时候Window XP和Windows 2003里面对C#的处理不一样,似乎2003比XP更加健壮(很多时候2003上面没有问题但是XP下就有问题).我想说的是.Net 不是有个框架吗?难道还和平台相关?还是因为涉及到了Windows的窗体消息机制,两者实现上有什么不同?
软件版本信息:
C# Version1.1
Visual Studio 2003
Windows XP 最新补丁包 多国语言版本
谢谢耐心看完!期待您的回复.