1

この質問に引っ掛かりたいのですが、おそらく別の角度から言い換えてください。

詐欺防止の目的で、一定量の不正なログイン試行の後、訪問者をブロックしたいと考えています。この時点で、ログインするための実際の関数呼び出しをラップするマネージャー クラスがあります。訪問者がブロックされ、実際のログイン メソッドが呼び出されない場合、マネージャーは例外をスローします。ここまでは順調ですね。

Thread.Sleep例外をスローする部分を一種のものに変更したいと思います。ただし、サーバーへの他のリクエストがブロックされるため、これはオプションではありません。おそらくいくつかの待機コマンドを使用するか、おそらく使用するこのシナリオの簡単な代替手段はありますか?asyncF#

現在のコード:

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 分間待機」は「await 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 に答える