并发页面处理/服务

时间:2014-01-31 22:39:46

标签: asp.net multithreading

我创建了一个包含构建联系人列表的子应用程序的Web应用程序。此子程序根据用户提供的ID从联系人db中提取电话号码和电子邮件地址。以最快的速度,应用程序将处理大约每秒4个ID。在任何给定时间有200-300个ID,完成时间很长。

时间不是真正的问题,它是最终用户状态更新。我已经创建了一个非常粗略的Web服务,它读取存储在会话变量中的“CurrentRecordNumber”,因为应用程序循环通过ID。我打算使用javascript定期从应用程序调用webmethod来更新状态。

我的问题是,在调试时,webmethod调用将成功完成,但直到应用程序处理完毕才会完成。

这似乎是一个非常简单的问题。我不能使用正确的术语,因为我的结果看起来过于复杂。

我对ASP.NET的异步功能很新,所以请原谅。但是,我编写了一些包含多个线程的Winforms,因此我对线程有了基本的了解。

1 个答案:

答案 0 :(得分:0)

这是由于ASP.NET处理会话的方式。你还没有说过你是使用webforms还是MVC,但是MVC有一个快速的解决方法。

首先,问题: SessionState被设计为按服务器接收的顺序一次一个请求访问。您可以将此视为银行排队,只有一名银行出纳员。排在第一位的人是第一个受到帮助的人(尽管这是基于每个会话的,而不是每个用户)。

ASP.NET锁定所有其他需要执行SessionState的请求,直到完成上一个请求。

我还没有尝试在网络表单中更正此问题,但我知道最简单的方法是在进度检查中不需要SessionState。

在MVC中,可以应用于控制器或方法的SessionState属性,表明没有机会调用该方法覆盖SessionState。只要您的呼叫是只读的,您就可以使控制器代码使用此属性同时允许多个异步请求:

<SessionState(SessionStateBehavior.ReadOnly)>
Public Class MyController