【问题标题】:ASP.NET Background Thread blocking page accessASP.NET 后台线程阻止页面访问
【发布时间】:2019-02-26 16:19:09
【问题描述】:

我有一个基于 .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 分钟)。到这里为止一切都很好。

似乎运行良好,我仍然可以使用该网站并导航到不同的页面,例如操作完成时的主页。

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

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

最好的问候。

【问题讨论】:

  • starter += ??您有一个多播委托作为您的线程工作者?为什么?
  • 连续执行2段代码是一种很奇怪的方式。
  • 设置页面是否访问正在以任何方式构建的 lucene 索引?

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


【解决方案1】:

这可能是由于会话互斥锁而阻塞的。尝试将以下内容添加到页面 (aspx) <%@ Page EnableSessionState="true|false|ReadOnly" %> (false 或 ReadOnly)

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

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2017-08-01
    • 2015-10-23
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多