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);

(当请求超时时,WebRequestMaker 对象也会引发ReponseReceived事件,顺便说一句)

在 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实际上使用的是 a System.Net.WebClient,则可以调用异步版本。有关任务和 async/await 的更多信息可以在 MSDN 中找到。

于 2013-07-22T14:08:44.803 回答
0

是的,每个函数调用都会被推送到调用堆栈并在完成时弹出。您提到的错误在调用堆栈已满时触发,而不是在大多数语言中,而不是在 javascript 中(实际上我不知道任何没有的错误)。

您应该在此处应用与 Javascript 中相同的逻辑。

于 2013-07-22T13:55:49.670 回答