【问题标题】:Create a delay in ASP.NET 3在 ASP.NET 3 中创建延迟
【发布时间】:2020-07-11 06:17:05
【问题描述】:

我被困在 ASP.NET 3 中,这意味着我无法使用 Task asynchronous programming model。在 ASP.NET 4 之前,我认为我可以安全地执行await Task.Delay(n).ConfigureAwait(false);,但这不是这里的选项。

我想在 ASP.NET 中响应之前故意创建一秒延迟,但我想确保我只影响当前请求而不延迟其他用户。线程池之类的从来都不是我的强项。

如果我使用Thread.Sleep(1000),它会阻塞当前线程——这是否意味着只有这个特定的请求?或者其他请求是否可能在同一个线程上并被阻塞,尤其是在流量负载很大的情况下?

Task.Delay(1000).Wait() 的行为方式是否相同?

我过去在做这种事情时也遇到过死锁,我从来没有真正理解过,那么这些可能会导致其他请求的死锁吗?

我有两种情况:

首先,在控制器动作内部:

public ActionResult DoSomething() {
    DoSomethingElse();
    Thread.Sleep(1000); // Or Task.Delay(1000).Wait() or whatever
    return something;
}

我在一个单独的任务中也需要这两个,我从一个控制器动作开始,比如一个即发即弃,我用类似的东西调用它:

Task.Run(() => RunProcess(processID))
    .ContinueWith(task =>
        {
            if (task.IsFaulted) { /**/ } else { /**/ }
        }
});

void RunProcess(Guid processID) { 
    DoAnotherThing();
    Thread.Sleep(1000); // or Task.Delay(1000).Wait() or whatever else
}

【问题讨论】:

    标签: c# asp.net-mvc async-await


    【解决方案1】:

    Thread.Sleep 可能没问题。但这取决于您的负载以及请求的其余部分在做什么。

    ASP.NET 确实为每个请求分配一个单独的线程,所以如果你睡在一个线程上,它不会影响其他请求。

    也就是说,存在最大线程数。默认情况下,每个 CPU 内核有 20 个线程,但它是可配置的。请参阅 processModel Element (ASP.NET Settings Schema) 文档中的 maxWorkerThreads

    因此,只有每秒获得超过 20 倍 [您的 CPU 内核] 时,您才会遇到问题。然后在每个请求中引入一秒钟的延迟,如果您的负载很高,则会导致请求队列备份。

    您还必须考虑请求的其余部分正在做什么。如果您有 1 秒的睡眠时间 + 1 秒的处理时间,那么如果您的负载是每秒 10 倍 [您的 CPU 内核],您将开始遇到问题。因此,如果您认为您的负载可能很高,则值得计算整个请求需要多长时间。

    如果您认为自己可能有问题,可以提高 maxWorkerThreads 值。

    【讨论】:

    • 太好了,这听起来像我想要的。我将更深入地研究processModel,但由于这是我很少使用的东西,而不是同时使用一堆,似乎阻塞 40 个线程中的一个或任何我的核心乘数不会造成太大的麻烦。非常感谢。
    【解决方案2】:

    正如你提到的 Thread 类的睡眠功能,它正是你需要的东西,它只是让当前线程睡眠你设置的时间,但关于 dotnet 任务,它是不同的,dotnet 获取线程并将其用于其他请求直到延迟时间到期,然后一个线程处理你的函数的其余部分。 处理这种情况的其他一些方法在忙于等待时也有效。循环不好。

    线程休眠: https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.sleep?view=netcore-3.1

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2021-09-07
      • 1970-01-01
      • 2015-02-15
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多