在ASP.NET Web应用程序中执行等待操作?

时间:2012-02-23 14:50:32

标签: asp.net performance sleep async-await

我想加入this问题,但也许从另一个角度重新阐述它。

出于反欺诈目的,我想在一定数量的不正确登录尝试后阻止访问者。此时我有一个管理器类,它将实际的函数调用包装到login。如果访问者被阻止,则管理器会抛出异常,因此永远不会调用实际的登录方法。到目前为止一切都很好。

我现在想将异常抛出部分更改为Thread.Sleep种类。但这不是一个选项,因为这将阻止对服务器的其他请求。是否有一个 easy 替代方案,可能使用某些async等待命令或者使用F#

当前代码:

class Manager {
    void Execute(Action action) {
        if(user.IsBlocked)
            throw new BlockedException();
        else
            action();
    }
}

首选代码:

class Manager {
    void Execute(Action action) {
        if(user.IsBlocked)
            //Wait for xxx minutes


        action();
    }
}

2 个答案:

答案 0 :(得分:3)

你可以创建一个只延迟一段时间的任务(帮助方法已经可以这样做 - TaskEx.Delay)并等待那个 - 那么你不会在那段时间内绑定一个线程。

所以“//等待xxx分钟”将“等待TaskEx.Delay(TimeSpan.FromMinutes(xxx))”

你可以在这里看到一个例子:

http://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern

Console.WriteLine("Before await");
await TaskEx.Delay(1000);
Console.WriteLine("After await");

答案 1 :(得分:1)

这样做会很快耗尽资源。您不希望服务器上有多个线程(可能有几十个线程,具体取决于访问者的数量和阻止的持续时间),等待您最终发送响应。此外,访客不清楚发生了什么事情;看起来你的服务器似乎没有响应(这是真的)。 更好的方法是继续抛出异常并且可以更优雅地处理它。例如,使用javascript在客户端上显示倒计时,直到您再次尝试为止。