关于webservices的问题

特别安静 2009-10-05 12:05:23
我的系统是C/S的,在客户端用到服务端的webservices,客户端每次都会在服务端返回信息后才有反应,如果服务端长时间不返回信息就会出现假死的状态
请问有什么好的方法避免这种情况的出现
用多线程的话,返回的信息里面有部分信息会被别主线程用到,而多线程不允许不同的线程访问
用异步处理的话,假如前一个请求发送到服务端,在没有返回信息之前又发送了一个请求到服务端,这两个请求所返回的信息会不会出现错误或者是后面的覆盖前面的?
来个高手就这个问题给个详细点的回复,谢谢.
...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2009-10-05
  • 打赏
  • 举报
回复
(1)在启动的时候初始化一下Web Service。经验表明,第一次装载Web Service比较慢,但是以后快多了。
(2)使用Visual Studio自动生成的异步调用Web Service代理的代码,不会出现错乱的情况。
特别安静 2009-10-05
  • 打赏
  • 举报
回复
来个人帮帮我啊
特别安静 2009-10-05
  • 打赏
  • 举报
回复
自己顶下
特别安静 2009-10-05
  • 打赏
  • 举报
回复
我在服务器上的webservices里有个方法
public DataSet getdutyandworkstyle(int companyid, string uid, string uname, DateTime dtimeclient)
{
//具体方法
dataset ds = new dataset();
//返回ds
return ds;
}

在客户端先定义
myservice.getdutyandworkstyleCompleted += new webservers.getdutyandworkstyleCompletedEventHandler(myservice_getdutyandworkstyleCompleted);

void myservice_getdutyandworkstyleCompleted(object sender, FingerPrintSystem.webservers.getdutyandworkstyleCompletedEventArgs e)
{
datatable dt = e.Result.Tables[0];
//这里会有部分返回的值被用到主窗体上
}
然后异步调用
myservice.getdutyandworkstyleAsync(publicclass.companyid, ret, printername, DateTime.Now);

我测试的时候发送一个getdutyandworkstyleAsync,在服务器返回信息后再发送getdutyandworkstyleAsync就不会有问题,但是,我发送一个getdutyandworkstyleAsync后在服务端没有返回信息之前再发送一个getdutyandworkstyleAsync时就会出问题,系统提示错误,怎么回事啊?
难道一定要等到第一个信息返回后才能发送新的getdutyandworkstyleAsync吗?
这样的话异步没什么用啊?
如果用多线程的话,子线程如何去更新主线程的信息呢?
  • 打赏
  • 举报
回复
[Quote=引用楼主 wujiaohua 的回复:]
用多线程的话,返回的信息里面有部分信息会被别主线程用到,而多线程不允许不同的线程访问
用异步处理的话,假如前一个请求发送到服务端,在没有返回信息之前又发送了一个请求到服务端,这两个请求所返回的信息会不会出现错误或者是后面的覆盖前面的?
[/Quote]

其实在此,多线程和异步是基本相同的概念,只是你写的具体代码不同而已,实质是完全相同的。

当异步处理业务逻辑是,那么在设计思想上你就应该有个180度的转身。这时候就不是什么“主线程用到子线程的信息”,不是什么主线程等值子线程取得信息之后再去更新界面这种顺序执行的编程思想,而是子线程去更新界面。

如果说“两个请求返回的信息后边的覆盖前面的”,通常忽略这种问题。其关键还是,不要要用顺序编程的思想去设计程序,那么这种由另外的主线程去轮询、等待子线程的逻辑就会很少。当那种设计很少出现,也很容易通过修改数据来安排操作时序。

当使用多线程或者说异步处理方式设计软件时,所有的事情都是在异步处理之前安排好的,然后把策略(例如作为一个Delegate为参数)发给子线程。

打个比方,就好像一个软件公司的PM总是把软件设计做好,然后把具体的软件任务以及验收测试方法事先给具体执行任务的程序员以文字形式发布清楚并留有档案。相比之下,那种用含糊的语句简单分解一下任务给程序员,然后让程序员自己其完成本应该是架构师和PM才完成的设计和协调任务,等程序员做完了这时候PM又把各个程序员的东西合并在一起并且挑三拣四地指责某些程序员没有领会设计需求,这种PM的手段就类似于把顺序编程的逻辑用在异步编程上,是低级的、无效率的。
  • 打赏
  • 举报
回复
长时间不返回信息就会出现假死的状态

c/s 模式使用多线程就OK了
Jeff20040819 2009-10-05
  • 打赏
  • 举报
回复
UP

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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