1

我想提出这个问题,但也许从不同的角度改写它。

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

我现在想将异常抛出部分更改为Thread.Sleep一种东西。然而,这不是一个选项,因为这将阻止对服务器的其他请求。对于这种情况,是否有一个简单的替代方案,可能使用一些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();
    }
}
4

2 回答 2

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");
于 2012-02-23T17:11:03.147 回答
1

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

于 2012-02-23T15:02:39.280 回答