0

私は Asp.net MVC 4 を使用しており、ユーザーがページ上のリンクをクリックしたときにバックグラウンドで関数を実行しようとしています。

私は検索して検索しましたが、どうすればよいかわかりません。

私が実行しようとしている関数は 内の関数でありPhoneNumbersController、何も返さず、多くの作業を行うだけです。

基本的に、ユーザーは電話番号のリスト (非常に大量の番号) を入力し、クリックします。

サーバーは、これらの電話番号をすべて DB に保存します。次に、サーバーに次のような関数を実行させます。

    Foo(int accountId)
    {
        var account = GetAccountById(accountId);

        while (account.IsRunning)
        {
            var Number = (from n in account.PhoneNumbers
                          where n.Status = "new"
                          select n).FirstOrDefault();
            // Do some work on Number.

            Thread.Sleep(1000); // I'm working with an API that limits you to 1 per second.

            account = GetAccountById(accountId);
        }
    }

そのコードはひどいものですが、例を示すだけです。

おそらく少なくとも 100,000 個の数値を実行する予定なので、これを一時停止して再開できるようにする必要があります (したがって、while(IsRunning) 変数を使用します。その値を false に設定する一時停止関数があります。

これまで非同期リクエストやマルチスレッドを使用したことがない人として、ここで最適なオプションは何でしょうか?

前もって感謝します!

4

2 に答える 2

1

編集:以下のコメントを読むと、アプリケーションプールが作成されたスレッドを強制終了する可能性があるため、このソリューションは短いタスクにのみ適しているようです

バックグラウンド スレッドを作成するだけです。

var t = new System.Threading.Thread(() => Foo(yourAccountId)) {IsBackground= true};

そしてそれを実行します:

t.Start();
于 2013-09-26T06:39:56.403 に答える
0

私の意見では、ASP.NET Web サイト内でこのために新しいスレッドを生成する必要はありません。各クライアント要求は、ISS のスレッドで処理されます。

ただし、プロセスが実際にWebサーバーから離れて時間がかかりすぎている場合は、疑わしい. 実際の作業はいつでも別のシステムに委任できます。

于 2013-09-26T06:44:20.887 に答える