2015-04-13 3 views
11

In meiner ASP.net-Webanwendung habe ich Code im Page_Init-Ereignis() meiner Seite, das einige Sitzungsvariablen überprüft, um Benutzer umzuleiten, wenn ein Sitzungszeitlimit aufgetreten ist.Silverlight-Seitenlebenszyklusprobleme mit Asyncronous Event Handler

In meinem Silverlight-Anwendung habe ich eine Schaltfläche Event-Handler, die asynchron einige ESRI ArcGIS-Code ausführt, und die konfiguriert eine Ereignisbehandlungsroutine, die ausgelöst wird, wenn der asynchrone Aufruf abgeschlossen ist:

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

Es gibt auch ein Stück Code ruft eine JavaScript-Funktion auf der Seite auf, um ein Panel auszublenden. Die Einbeziehung dieses Codes verursacht einen vollständigen Seitenpostback.

HtmlPage.Window.Invoke("hideReport"); 

Mein Problem ist, dass manchmal die queryCountyTask_ExecuteCompleted() Silvelright Ereignis ausgelöst wird, bevor die Page_Init() Seite Ereignis und manchmal, nachdem sie abfeuert. In den Fällen, in denen das Silverlight vor dem Page-Ereignis ausgelöst wird, ist der Sitzungsstatus leer, sodass der Benutzer fälschlicherweise auf die Seite "Ihre Sitzung hat Zeitüberschreitung" umgeleitet wird. Solange das Silverlight-Ereignis nach dem Page-Ereignis ausgelöst wird, sind die Sitzungsvariablen weiterhin vorhanden und alles funktioniert einwandfrei.

Es sieht so aus, als ob die Platzierung der Invoke-Methode keinen Einfluss auf das Ereignis auf Seitenebene hat, sodass die Reihenfolge der Ereignisse scheinbar zufällig erscheint. Gibt es eine Möglichkeit, die Events zu bestellen, um diese Rennbedingungen zu vermeiden?

Gibt es eine Möglichkeit, diese asynchronen Rückrufereignisse mit dem normalen Seitenlebenszyklus einer Webanwendungsseite zu koordinieren, um diese Race-Bedingungen zu vermeiden?

Antwort

1

Wenn Sie das Problem umdrehen, wie Sie Ihre ASP.net-Seite dazu bringen, die Silverlight-Funktionen nach deren Abschluss auszulösen, wird es keine Wettlaufbedingung geben.

Hier ist eine Link, wie Sie Ereignisse in Silverlight skriptfähig von externen Javascript, die helfen sollten.

+0

Leider werden nicht Silverlight-Funktionen direkt aufgerufen, sondern Silverlight-Ereignisse, die von ESRI ArcGIS-Serviceaufrufen ausgelöst werden (dh Ereignisse, die entweder ausgelöst werden, wenn eine GIS-Abfrage erfolgreich oder nicht erfolgreich ist). Die Zeit, die zum Ausgeben dieser Abfrage benötigt wird, bestimmt, ob sie vor dem Postback zurückgegeben wird. – bperniciaro

+0

Die Methode zum Aufrufen von Silverlight-Methoden von Ihrer Serverseite sollte funktionieren, da Sie warten können, bis die Seite geladen ist, um die Abfrageaufrufe auszuführen. Sie müssen lediglich den Code aus dem Silverlight-Code, der beim Laden ausgeführt wird, verschieben und in Methoden verschieben, die Sie aufrufen, sobald die Seite geladen ist. Sie können auch den Status von der Server-Seite an das Silverlight-Plugin übergeben, indem Sie die InitParams-Eigenschaft http://weblogs.asp.net/lduveau/provide-startup-parameters-to-silverlight-with-initparams verwenden –