我被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;
}我还需要在一个单独的任务中完成这两个任务,我从一个控制器操作开始,就像一个fire-and-forget,我用下面这样的东西来调用它:
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
}发布于 2020-07-11 06:17:06
Thread.Sleep可能没问题。但这取决于您的负载和请求的其余部分在做什么。
ASP.NET会为每个请求分配一个单独的线程,所以如果您在一个线程上休眠,它不会影响其他请求。
也就是说,有一个线程的最大数量。默认情况下,每个CPU核心有20个线程,但它是可配置的。请参阅processModel Element (ASP.NET Settings Schema)文档中的maxWorkerThreads。
因此,只有在每秒CPU核心数超过20倍的情况下,才会遇到问题。然后,在每个请求中引入一秒的延迟将导致请求队列在负载如此之高时进行备份。
您还必须考虑到请求的其余部分正在做什么。如果你有1秒的睡眠+1秒的处理时间,那么如果你的负载是每秒CPU核心的10倍,那么你就会开始出现问题。因此,如果您认为您的负载可能很高,那么计算整个请求所需的时间是值得的。
如果您认为可能有问题,可以提高maxWorkerThreads的值。
发布于 2020-07-11 05:42:35
正如你提到的Thread类的睡眠函数,这正是你需要的,它只是在你设置的时间量内休眠当前线程,但对于dotnet任务,它是不同的,dotnet获取线程并将其用于其他请求,直到延迟时间到期,然后其中一个线程处理你函数的其余部分。其他一些处理这类工作的方法是忙于等待..循环是不好的。
线程睡眠:https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.sleep?view=netcore-3.1
https://stackoverflow.com/questions/62842608
复制相似问题