2012-12-10 91 views
1

我有一个Windows服务,它监视一个表(带定时器)的行,当它们出现时抓取一行,将这些信息提交给一个RESTful Web服务,分析响应并写入关于回应表格。通过使这个异步我会获得什么?我现在的(精简)的Web服务提交代码如下:我应该使用异步处理吗?

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); 
HttpWebResponse resp; 
try 
{ 
     resp = (HttpWebResponse)req.GetResponse(); 
} 
catch (WebException we) 
{ 
     resp = (HttpWebResponse)we.Response; 
} 

if (resp != null) 
{ 
     Stream respStream = resp.GetResponseStream(); 
     if (respStream != null) 
     { 
      responseBody = new StreamReader(respStream).ReadToEnd(); 
     } 

     resp.Close(); 
     respStream.Close(); 
} 

return responseBody; 
+0

如果您不必同时做某件事情,并且由于用户不受影响,绝对不会。由于它是一项服务,另一个线程可以完成所需的任何其他活动。 – kenny

+0

如果您可以详细说明几个细节,可能有助于得到更彻底的答案:在x时间内需要处理的典型记录数量是多少?你的程序流程是什么? (意思是,你是否拉一条记录,发出请求,等待响应,更新数据库,获取下一条记录,重复;或者你有其他流量吗?) –

+2

除非你的Windows服务真的忙于做其他事情而且你不希望它等待响应,我并没有看到使这个异步的任何价值。另一方面,我应该指出WebResponse(因此HttpWebResponse),Stream和StreamReader都实现了IDisposable而应该配置。 – Pete

回答

0

如果您不在乎需要多长时间才能获得针对任何单个请求的响应,否则没有特殊理由使其异步。

另一方面,如果您在开始下一个请求之前等待一个请求完全结束,则可能在处理大量音量时遇到问题。在这种情况下,您可能想要查看并行代码。但如果您将大量项目输入数据库进行处理,那就值得讨论。

+0

如何?如果他有一个连接到数据库的客户端,则获取一个新行并向远程服务发出请求,等待响应并将其保存到数据库,然后获取下一行 - 这不是一个并行过程。这可能有助于我们详细的程序流程。编辑 - 我发誓有一个评论,我回复 - 现在我看起来像一个怪人! –

+0

感谢大家的意见。这是我正在寻找的信息。 – DerPflug

0

通过使用异步方法你避免需要有一个专门的线程阻塞的异步操作的结果。您可以释放该线程以处理其他更高效的任务,直到异步任务完成并再次进行生产性工作。

如果您的服务需求量不高,而且您不需要频繁地处理需要执行的工作而不是线程,那么您无需担心。对于许多商业应用程序,它们的使用率如此之低,以致不需要。

如果你有一个大规模的应用服务足够的用户,你有很多的并发请求(即使它只是在高峰使用时间),那么它可能是工作切换到异步对口。

+0

我明白这不是他询问的服务代码,而是他的客户端代码将数据提交给服务并等待响应。尽管使用异步来释放线程直到响应进入仍然有效,但在客户端通常不如服务器重要。如果这是服务器,我可能会经过努力。 –