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

问题描述 投票:0回答:1

我有一个(非常古老但仍然维护)网站建立在.NET WebForms上。

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

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

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();
}

正如预期的那样,这个过程需要一些时间才能完成,因为CVSearchIndex.BuildIndex();操作非常长(超过10分钟)。一切都很好,直到这里。

它似乎工作得很好,我仍然可以使用该网站并导航到另一个页面,例如操作完成后的主页。

但是,一旦我尝试导航回“设置”页面,它就不会加载,直到线程结束(当它构建搜索索引时)。

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

最好的祝福。

c# asp.net .net multithreading lucene.net
1个回答
-1
投票

由于Session mutex,这可能会阻塞。尝试将以下内容添加到页面(aspx)<%@ Page EnableSessionState="true|false|ReadOnly" %>(false或ReadOnly)

或者,如果它只是一个火灾和忘记操作,您可以将其设置为计划任务,然后从您的方法手动启动它,允许该方法立即结束(在后台运行该作业)

© www.soinside.com 2019 - 2024. All rights reserved.