【问题标题】:Why is my task in Application_Start() being stopped/cancelled/terminated?为什么我在 Application_Start() 中的任务被停止/取消/终止?
【发布时间】:2013-06-10 08:24:57
【问题描述】:

我的 ASP.NET MVC 4 Web 应用程序中有以下代码:

Global.asax.cs

protected void Application_Start()
{
    Task.Factory.StartNew(
        () =>
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                Thread.Sleep(100);
                Trace.WriteLine("Working");
            }
        },
        cancellationToken,
        TaskCreationOptions.LongRunningTask,
        TaskScheduler.Current);
}

似乎该任务在应用程序初始化时开始运行,运行了一段时间,然后停止了。只要 AppDomain 正在运行,我就想继续运行。是什么导致它停止?我能做些什么来阻止它停止?

【问题讨论】:

  • 如果您发布了真正有意义的代码,将会有所帮助。当您的方法声明为void-returning 时,您的方法如何返回TaskLongRunningTask() 中的 cancellationToken 来自哪里?您能否发布实际演示您的问题的简短(和编译)代码?
  • 对不起,为了简洁起见,我在尝试简化代码时犯了一些错误。很难将现有的复杂应用程序浓缩为简短的 sn-p。我想我现在已经修复了上面的代码示例。

标签: asp.net asp.net-mvc-4 task-parallel-library task background-process


【解决方案1】:

从您获得的代码来看,您的 cancelToken 似乎为 null,并且您的代码行上有 NullRefernceException:

 while (!cancellationToken.IsCancellationRequested)

你能在日志中看到这样的异常吗?

【讨论】:

  • 对不起,你是对的,但这只是因为我把代码示例过于简化了。我现在已经更正了代码示例。该任务确实运行并“循环”了几次 while 循环,但随后它停止了。
  • CancellationTokenstruct,所以它永远不可能是null
【解决方案2】:

事实证明,根本问题是 Glimpse TraceInspector,这是this issue 的副作用。

因为这导致抛出异常,所以任务被停止。

我仍然无法完全解释细节,但将其添加到我的 Web.config 解决了问题:

  <glimpse>
    <inspectors>
      <ignoredTypes>
        <add type="Glimpse.Core.Inspector.TraceInspector, Glimpse.Core"/>
      </ignoredTypes>
    </inspectors>
  </glimpse>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多