0

JavaScript で可能なアプローチが C# でも使用できるかどうか疑問に思っています。

JavaScript アプリケーションでは、大量の Web リクエストを次々に行う必要がある場合、for ループを回避し、代わりにスタック (配列) とイベントを使用することで、UI の応答性を維持できます。次の URL は、成功イベント ハンドラーの配列からポップされ、スタックが空になるまで別の要求を行い続けます。スタックを使用してC#で同様のアプローチをとることはできますか? 以下は合法ですか?

     urlStack .... // stack of urls
     myRequestMaker = new WebRequestMaker();   // my custom object
     myRequestMaker.ResponseReceived += (s,e) =>
     {
         // e contains info whether the request succeeded, failed, or timed out

         url = pop another url from urlStack if it's not empty
        (s as WebRequestMaker).MakeWebRequest(url);
     }

    url = pop first url from urlStack
    myRequestMaker.MakeWebRequest(url);

( ReponseReceivedイベントは、要求がタイムアウトしたときにも WebRequestMaker オブジェクトによって発生します)

JavaScript では、このアプローチを使用して最大再帰制限に達することができます。これを回避するために、成功イベント ハンドラ内で行われたメソッド呼び出しを SetTimeout でラップすることができます。ResponseReceived イベントハンドラ内でmyRequestMaker のMakeWebRequestメソッドを呼び出すと、同様の問題が発生しますか?

4

2 に答える 2

0

はい、あなたのコードは最終的にヒットしStackOverflowExceptionます。コードを非同期で実行setTimeoutするクラスを使用して、動作をシミュレートできます。System.Task

myRequestMaker.ResponseReceived += (s,e) =>
 {
     // e contains info whether the request succeeded, failed, or timed out

     url = pop another url from urlStack if it's not empty
     Task.Run(() => (s as WebRequestMaker).MakeWebRequest(url));
 }

(もちろん、競合状態を回避するために、urlStack は並行する必要があります)

上記のコードを使用せずMakeWebRequestAsync、ジョブを非同期で実行するメソッドを実装するのが最適です。.Net のほとんどの組み込みの長時間実行/ブロックイン メソッド (ストリームからの読み取りとストリームへの書き込みなど) は既にそのようなメソッドを実装しているため、WebRequestMaker実際に を使用しているSystem.Net.WebClient場合は、非同期バージョンを呼び出すことができます。タスクと async/await の詳細については、MSDN を参照してください。

于 2013-07-22T14:08:44.803 に答える
0

はい、すべての関数呼び出しがコール スタックにプッシュされ、終了時にポップされます。あなたが言及したエラーは、ほとんどの言語で、javascriptではなく、コールスタックがいっぱいになったときに発生します(実際、そうでないものは知りません)。

ここで Javascript と同じロジックを適用する必要があります。

于 2013-07-22T13:55:49.670 に答える