C# 在ASP.NET 3中创建延迟

C# 在ASP.NET 3中创建延迟,c#,asp.net-mvc,async-await,C#,Asp.net Mvc,Async Await,我被困在ASP.NET3中,这意味着我不能使用ASP.NET3。在ASP.NET4 forward中,我认为我可以安全地执行wait Task.Delay(n)、configurewait(false),但这不是这里的选项 我想在ASP.NET中响应之前故意创建一秒钟的延迟,但我想确保我只影响当前请求,而不会延迟其他用户。线程池之类的东西从来都不是我的强项 如果我使用Thread.Sleep(1000),它会阻止当前线程-这是否意味着仅此特定请求?或者其他请求可能在同一个线程上被阻塞,特别是在流

我被困在ASP.NET3中,这意味着我不能使用ASP.NET3。在ASP.NET4 forward中,我认为我可以安全地执行
wait Task.Delay(n)、configurewait(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
}

正如您提到的Thread类的Sleep函数,它正是您所需要的,它只是在您设置的时间内睡眠当前线程,但是关于dotnet任务,它是不同的,dotnet获取线程并将其用于其他请求,直到延迟时间到期,然后其中一个线程处理您的其余函数。 处理这类工作的其他一些方法我正忙着等待。。这不好

线程睡眠:
线程。睡眠大概可以。但这取决于您的负载以及请求的其余部分在做什么

ASP.NET确实为每个请求分配了一个单独的线程,因此如果您在其中一个线程上睡眠,它将不会影响其他请求

也就是说,有一个最大数量的线程。默认情况下,它是每个CPU核心20个线程,但它是可配置的。请参阅文档中的
maxWorkerThreads

因此,只有当每秒的CPU内核数超过20倍时,您才会遇到问题。然后在每个请求中引入一秒钟的延迟将导致请求队列在负载如此高的情况下备份

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


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

太好了,这听起来像是我要找的。我将更深入地研究
processModel
,但由于这是我很少使用的,而且不是同时使用的一堆线程,因此似乎阻止40个线程中的一个或我的核心乘法器不会带来太多麻烦。谢谢你,穆乔。