Thread.Sleep,AJAX,Session和Web表单中的请求排队

时间:2014-12-18 21:40:33

标签: c# asp.net ajax multithreading

我遇到的问题是我的代码是在数据库中创建重复数据。我相信以下是正在发生的事情(尽管它应该是不可能的):

我们有一个页面,它有一个长时间运行的任务,由UpdatePanel启动(在这种情况下,由计时器触发)。此任务从Web服务中获取数据,删除本地副本(实际上只是设置IsDeleted标志,而不是sql DELETE),并创建一个新对象并将其提交给DB。

我认为重复的核心原因是用户在AJAX请求返回之前关闭/重新加载选项卡并重新启动该过程。当第一个AJAX请求仍在处理时,第二个请求开始。记录回来了。

然而,我知道这应该是不可能的!有问题的页面读取和写入Session,并且EnableSessionState未设置为ReadOnly或Disabled。请求应该已排队,而不是交错。然而,日志清楚地显示以下内容:

线程1处理中途完成(删除一半数据并创建新对象),然后Web服务开始滞后。

线程2开始,抓取已被线程1更新一半的数据。这一半更新正常(因为它就像从线程2的角度来看常规数据刷新;就像我们有排队请求)

线程1完成,删除数据的后半部分,创建新对象。

线程2完成,删除数据的后半部分(与线程1刚刚完成相同,但我们正在使用的ORM不会抱怨)并创建新对象,这些对象是对象线程1的重复项创建

我知道有六种解决问题的方法;那不是我的问题。我的问题是:ASP.NET中长时间运行(分钟长)的进程是否有任何特殊之处可以让进程交错? AJAX请求怎么样?

我唯一能想到的是我们在DLL中做了类似的事情:

DateTime now = DateTime.Now();
DateTime until = now.AddMinutes(3);
while(until > now){
    var result = makeWebServiceRequest();
    if(result.error == 0){
         //process data
    }
    //Try again in 10 seconds
    System.Thread.Threading.Sleep(10000);
}

当一个线程处于休眠状态时,它是否可能不会计入会话队列,特别是因为它在外部程序集中?

1 个答案:

答案 0 :(得分:0)

查找executionTimeout http://msdn.microsoft.com/en-us/library/vstudio/e1f13641(v=vs.100).aspx

由于您的请求花费的时间超过默认的110秒,因此您可能会遇到这种情况 - ASP.NET释放Session上的锁定并让排队的请求继续进行。