我遇到一个长同步请求会冻结Internet Explorer的问题。 让我解释一下上下文:这是一个只支持IE8且只能使用Synchronous *的Web应用程序。 我们有一个带保存按钮的Silverlight组件。当用户按下按钮时,使用同步XMLHttpRequest将一些信息发送到服务器,然后在Silverlight组件中的客户端执行一些其他操作。 服务器端部分包括有时需要一段时间(几分钟)的计算。
简而言之,这是代码(c#silverlight部分)
ScriptObject _XMLHttpRequest;
_XMLHttpRequest.Invoke("open", "POST", url, false);
_XMLHttpRequest.Invoke("send", data);
checkResponse(XMLHttpRequest);
doOtherThings();
我知道服务器正常工作,因为我可以在详细日志中看到,从Silverlight调用的“url”的页面结束呈现。 但是,在调试模式下,我可以看到我从未到达“checkresponse”行。在调用“发送”行后,IE将永远冻结,一旦服务器日志显示已经处理了“url”,就不会解冻。
另外,我试图在“打开”和“发送”行之间添加“_XMLHttpRequest.SetParameter(”timeout“,5000)”。 IE冻结5秒钟,然后执行“checkresponse”和“dootherthings”。然后IE在处理服务器端计算时再次冻结,并且在服务器完成其工作后不会解冻。
IE超时应该是3个小时(注册表项ReceiveTimeout设置为10800000),我也摆脱了IE 2-connexions限制(MaxConnectionsPer1_0Server和MaxConnectionsPerServer设置为20)。
最后一个重要信息:服务器端部件只需几秒钟而不是几分钟就没有问题。
你知道冻结的来源(IE bug,XMLHttpRequest bug,我做错了什么)以及如何避免这种情况?
谢谢!
凯文B
*(在Google的帮助下尝试解决我的问题时,我发现了大量的“使用asynch”和“同步不好”的帖子;但我无法在我的应用中进行此更改。切换应用程序, ajax加载,所有服务器端计算异步是一项巨大的工作,已经为我们的客户引用并且是一个长期目标。我现在需要一个短期修复)
答案 0 :(得分:0)
Silverlight几乎要求一切都是异步完成的。如果在UI线程上运行,任何长时间运行的同步进程都将挂起浏览器。如果您从未到达'checkResponse'代码行,则可能是在前一行上抛出了未处理的异常,并且正在吞下它。您可以检查浏览器的开发工具,看看是否有任何javascript错误。我很惊讶调用XMLHttpRequest同步工作,因为我希望它能锁定UI线程。但是,解决方案取决于您对异步的定义。
您可以尝试:
虽然这些选项是异步的,但它们不需要以不同的方式编写服务器代码(它可以保持同步)。在最终返回响应之前,我看到一个Web服务器处理了一个多小时的调用,此时Silverlight应用程序引发了一个回调。您甚至可以使用诸如TPL await / async之类的工具,或许多mvvm框架中可用的协同例程,以使代码看起来非常程序/同步,同时仍然异步执行其操作。
我希望你已经解决了你的问题,但也许这对任何人都会有所帮助。