【问题标题】:Silverlight Page Lifecycle Problems with Asynchronous Event Handler异步事件处理程序的 Silverlight 页面生命周期问题
【发布时间】:2015-06-19 07:29:04
【问题描述】:

在我的 ASP.net Web 应用程序中,我的页面的 Page_Init event() 中有代码,它检查一些会话变量以在发生会话超时时重定向用户。

在我的 Silverlight 应用程序中,我有一个按钮事件处理程序,它异步执行一些 ESRI ArcGIS 代码,并配置一个在异步调用完成时触发的事件处理程序:

QueryTask queryTask = new QueryTask(myLayer.Url + "/" + layerID);
queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryCountyTask_ExecuteCompleted);
queryTask.ExecuteAsync(query);

还有一些代码调用页面上的 JavaScript 函数来隐藏面板。包含此代码会导致整页回发。

HtmlPage.Window.Invoke("hideReport"); 

我的问题是,有时 queryCountyTask_ExecuteCompleted() Silvelright 事件在 Page_Init() Page 事件之前触发,有时它在之后触发。在 Page 事件之前触发 Silverlight 的情况下,会话状态为空,导致用户被错误地重定向到“您的会话已超时”页面。只要在 Page 事件之后触发 Silverlight 事件,Session 变量仍然存在并且一切正常。

看起来 Invoke 方法的位置与何时触发 Page-level 事件无关,因此事件的顺序似乎是随机的。 有没有办法对事件进行排序以避免这些竞争条件?

有没有办法将这些异步回调事件与 Web 应用程序页面的正常页面生命周期协调,以避免这些竞争条件?

【问题讨论】:

    标签: asp.net silverlight arcgis


    【解决方案1】:

    如果您将问题翻转过来,如何让您的 ASP.net 页面在完成后触发 Silverlight 函数,这样就不会有竞争条件。

    这里有一个Link,关于如何使 Silverlight 中的事件可以从外部 JavaScript 编写脚本,这应该会有所帮助。

    【讨论】:

    • 不幸的是,不是直接调用 Silverlight 函数,而是由 ESRI ArcGIS 服务调用触发的 Silverlight 事件(即在 GIS 查询成功或不成功时触发的事件)。发出此查询所需的时间决定了它是否在回发发生之前返回。
    • 从服务器端调用 Silverlight 方法的技术应该可以工作,因为您可以等到页面加载完成后再进行查询调用。您只需要从加载时运行的 Silverlight 代码中移动任何代码,并将其移动到加载页面后调用的方法。您还可以使用 InitParams 属性 weblogs.asp.net/lduveau/… 从服务器端将状态传递给 Silverlight 插件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多