1

.Net 4.0 VS2010 環境の MVC 4 でプロジェクトを実行しています。ユーザーをフロントエンドで長時間待たせることなく、長時間実行されるSQLタスクを処理する必要があります。MVC 4 Web アプリケーションは、以下のコード スニペットを使用して SP を実行するデータ レイヤー メソッドを呼び出すビジネス レイヤーを呼び出します。

public DataSet ExecuteSP()
{

        dbc = database.GetStoredProcCommand('long_running_sp');
        dbc.CommandTimeout = 300;

        foreach (SPParams p in spParams)
        {
            dbc.Parameters.Add(new SqlParameter(p.ParamName, p.ParamValue));
        }

        DataSet ds = _database.ExecuteDataSet(dbc);

        return ds;
}

私が試した 2 つのオプションは、明らかに機能しない同期コントローラーを使用するもので、もう 1 つは AsyncController を使用するものでした。ストアド プロシージャの呼び出しがデータ層で行われた後、両方のオプションで Web サイトがハングしたことがわかりました。次に、AsyncController に Task.Factory.StartNew メソッドを導入しました。出来た。次に、同期コントローラーに同じものを適用しましたが、そこでも機能しました。

問題は、適用する必要があるのが Task.Factory.StartNew だけである場合、なぜわざわざ AsyncController を使用するのかということです。または、Task.Factory.StartNew を完全に捨てて、Service Broker Activationを使用してください。

ここでより良いオプションは何ですか?

4

1 に答える 1

2

AsyncController と通常のコントローラーの違いは、より多くのリクエストを同時に処理できることです。

あなたが抱えている状況は、ファイアアンドフォーゲットの状況です。AsyncController は、長いリクエスト (通常はネットワークまたは I/O バウンド) がある状況により適しています。クライアントの観点からは応答時間に違いはありませんが、サーバー レベルでは違いがあります。

同期コントローラーを使用すると、スレッドがブロックされます。IIS では、スレッドプールで使用できるスレッドの量が制限されています。スレッドをブロックすると、IIS のスレッドが不足する可能性があります。その結果、多くのブロックされたスレッドが必要になるため、他のスレッドがキューに入れられます。非同期コントローラーを使用すると、これらのスレッドが何もしていない間に解放されるため、他の要求を処理できます。

したがって、1 人のユーザーの観点からは、応答を待つ必要があるため、応答時間は同じになります。マルチユーザーの観点からは、より多くのユーザーに同時にサービスを提供できるため、合計応答時間は短縮されます。

前述のように、ファイア アンド フォーゲットを実行している場合は、非同期コントローラーを使用する理由はありません。必要なのは、クエリを起動して結果をユーザーに返すことだけだからです。あなたが適用している方法は、この状況に適した方法です。

結果をユーザーに返す必要がある場合は、待機中のスレッドが解放されるため、非同期コントローラーを使用することをお勧めします。(つまり、ネットワークまたは IO バウンドの場合です。CPU バウンドの場合はまったく利益がないためです)

于 2013-05-16T08:55:49.520 に答える