ASP.NET后台线程阻止页面访问

时间:2019-02-26 16:19:09

标签: c# asp.net .net multithreading lucene.net

我有一个(非常老但仍然维护着)基于.NET WebForms的网站。

最近,我需要添加一个任务/操作,该任务/操作在单击按钮时会启动一个后台线程,该线程会更新一堆不同的东西: 1-与外部API集成以获取信息并将其写入数据库 2-更新基于Lucene构建的搜索索引

在我们称为“设置”页面(Setting.aspx)上的代码如下所示:

SELECT InterventionId, STRING(Doctors.Name, ', ')
FROM Interventions I WITH (NOLOCK)
INNER JOIN Doctors D WITH (NOLOCK) ON D.Id = I.DoctorId
INNER JOIN Interventions_tool IT WITH (NOLOCK) ON I.Id = IT.ToolId
GROUP BY I.Id, D.Id;

+-----------------+------------+-----------------+
| InterventionId  |  Doctors   |      Tools      |
+-----------------+------------+-----------------+
|               1 | Tom, John  | Scalpel, Hammer |
|               2 | Tom, Homer | Hammer, Bulb    |
+-----------------+------------+-----------------+

由于protected void btnForcePartialSync_Click(object sender, EventArgs e) { Button button = sender as Button; string logLocation = HostingEnvironment.MapPath(VirtualPathUtility.AppendTrailingSlash(ConfigurationManager.AppSettings["SyncLogsLocation"]) + ConfigurationManager.AppSettings["PartialSyncLogName"]); if (File.Exists(logLocation)) Renamefile(logLocation); StreamWriter sw = new StreamWriter(logLocation); DateTime end = DateTime.UtcNow; DateTime start; if (button.Equals(btnDoPartialSyncMonth)) start = end.AddMonths(-1); else start = end.AddHours(-24); HttpContext ctx = HttpContext.Current; ThreadStart starter = () => { PopulateCv.ForcePartialSync(sw, start, end); }; starter += () => { HttpContext.Current = ctx; CacheService.ClearCache(CacheService.WORKS_COUNT_CACHE_KEY); int CvCount = DataAccess.Cv.Cv.GetActiveCvs().Count; CacheService.Add(CacheService.WORKS_COUNT_CACHE_KEY, CurriculumCount); CVSearchIndex.BuildIndex(); FillContentsIndexInfo(); }; Thread t = new Thread(starter) { IsBackground = true }; t.Start(); } 操作非常长(超过10分钟),因此此过程需要一些时间才能完成。一切都很好,直到这里。

似乎运行良好,我仍然可以使用该网站并导航到其他页面,例如操作完成后返回主页。

但是,一旦我尝试导航回“设置”页面,它只会在线程结束(构建完搜索索引后)才加载。

这不是我所期望的行为。如何在不对当前代码进行实质性更改的情况下解决此问题? 构建搜索索引时,可以使该页面的导航不阻塞吗?

最好的问候。

1 个答案:

答案 0 :(得分:-1)

这可能由于会话互斥而被阻止。尝试将以下内容添加到页面(aspx)some_string = "\t Hello, \n\t world!\n " new_string = " ".join(some_string.split()) # new_string is now "Hello, world!" (false或ReadOnly)

或者,如果这只是一次“一劳永逸”的操作,则可以将其设置为计划任务,然后从您的方法中手动将其触发,从而使该方法立即结束(在后台运行作业)