【发布时间】:2016-07-29 15:23:42
【问题描述】:
我想在 ASP.net 应用程序中插入睡眠(又名油门、延迟、tarpit、停留)(想象一下登录尝试失败、升级延迟之类的事情)。
protected void Page_Load(object sender, EventArgs e)
{
Int32 sleepyTime = GetSleepyTime(Request);
if (sleepyTime > 0)
System.Threading.Thread.Sleep(sleepyTime);
//...Continue normal processing
}
我希望所有剩余的处理继续正常进行;我只想让用户代理受苦。
问题在于 ASP.net 使用 ThreadPool 来处理请求。如果我要Sleep 5、10、30 秒,我会吃掉宝贵的有限资源。
我认为它需要类似于:
protected void Page_Load(object sender, EventArgs e)
{
Int32 sleepyTime = GetSleepyTime(Request);
if (sleepyTime > 0)
ABetterKindOfSleep(sleepyTime);
//...Continue normal processing
}
private void ABetterKindOfSleep(int milliseconds)
{
await SleepAsync(milliseconds);
}
private async void SleepAsync(int milliseconds)
{
System.Threading.Thread.Sleep(milliseconds);
}
但是从来没有写过任何 async/await 代码,也没有理解 async 和 await 去哪里的逻辑,或者为什么,或者即使它可以用来运行异步代码:我不知道是否可以用来运行异步代码。
阅读奖励
【问题讨论】:
-
您的标签表明您使用的是 .NET 2.0。
async/await模式是随 .NET 4.0 一起出现的。您选择了错误的标签还是故意的? -
@Nitram 适用于旧网站的解决方案(例如,如果我在 2005 年问过这个问题)显然更好。特别是因为我有一些代码被锁定在 2.0 中。但如果 .NET 2 不支持线程池,我将不得不接受没有办法限制。但我会尽我所能。
标签: asp.net .net iis httpmodule