【问题标题】:Alternative of thread.Abort() in Asp.net Core?在 Asp.net Core 中替代 thread.Abort()?
【发布时间】:2019-02-06 13:07:59
【问题描述】:

asp.net core 中的 thread.Abort() 是否有任何替代选项,因为它不再支持 .Core。

        //   Exceptions:
        //   T:System.PlatformNotSupportedException:
        //   .NET Core only: This member is not supported.

这是抛出 PlatformNotSupportedException 异常。

我使用了 thread.Interrupt() 但它没有按预期工作。

【问题讨论】:

  • 你想做什么?首先,在 Full 框架之上构建的 Web 应用程序中不需要 Thread.Abort。这是一个坏主意,尤其是在 2010 年引入了任务和取消令牌之后。
  • 你最绝对不应该在 ASP.NET 中使用Thread.Abort(),其中线程用于处理多个请求

标签: c# multithreading asp.net-core-mvc asp.net-core-2.1


【解决方案1】:

Thread.Abort() 已被删除,因为它无法可靠地移植到所有平台,并且如果使用不当,通常会对整个应用程序域构成威胁。

现在推荐的方法(尤其是对于 ASP.NET Core)是使用 Tasks 并使用 CancellationTokens “中止”它们。您可以详细了解如何使用 CancellationTokens here

【讨论】:

  • 您是否有关于上述删除 Thread.Abort 的原因的来源?具体来说: - 这是微软公布的决定背后的理由吗?我不是在“我们删除它”的声明之后——而是更多关于它为什么被删除的细节。内部原因。 - 为什么整个应用程序域被线程中止“构成威胁”?我可以理解在受限设备中这将是一个问题,尽管这可以通过仅在那些特定环境中引发异常来处理。这是把婴儿(所有平台)和洗澡水(一些受限设备)一起扔出去的情况吗?
【解决方案2】:

这里的一个解决方案可能是使用一个共享变量,除非设置为false,否则将允许线程继续,例如tickRunning 来控制以下代码示例中的循环:

using System;
using System.Threading;

namespace SharedFlagVariable
{
    class Program
    {
        static volatile bool tickRunning; // flag variable
        static void Main(string[] args)
        {
            tickRunning = true;
            Thread tickThread = new Thread(() =>
            {
                while (tickRunning)
                {
                    Console.WriteLine("Tick");
                    Thread.Sleep(1000);
                }
            });
            tickThread.Start();
            Console.WriteLine("Press a key to stop the clock");
            Console.ReadKey();
            tickRunning = false;
            Console.WriteLine("Press a key to exit");
            Console.ReadKey();
        }
    }
}

附:如果您更喜欢使用 System.Threading.Task 库,请查看 this 帖子,说明如何取消 Task 使用 CancellationToken 方法。

【讨论】:

  • 投反对票的请解释投反对票的原因,仅仅因为您可能不喜欢该解决方案而投反对票是不礼貌的。
  • 您的解决方案适用于您在示例中展示的简单场景,但对于构​​建更复杂应用程序的人来说,这通常不是一个好的建议。您的变量不是线程安全的,即使它被标记为volatile,与 Task/CancellationToken 相比,它仍然缺乏。很高兴您提到它们,但这并不是真正的“如果您愿意 - 使用它们”,而是“您应该使用它们”。此外,您很少需要或应该创建自己的线程,特别是考虑到 OP 询问了 ASP.NET Core。
  • 我明白你的意思,但人们并不总是在寻找非常复杂的解决方案,有时解决方案可能非常简单,或者这篇文章可以让你对如何做这些事情有一个基本的了解,以及当然欢迎您进一步增强它以使其更加优雅。此外,值得一提的是,我还提出了一种对某些人来说可能很方便的替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2018-05-31
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多