ThinkGeo.com    |     Documentation    |     Premium Support

Asynchronous binding

Hi ,



I am using Map Suite 7.0 and MsSql2008FeatureLayer to load my map.  I use Inmemoryfeaturelayer to load all features of the sql layer ;I have observed that the Map loads slow many times;.Once the layers are loaded everything looks fine but the initial load is very slow.



Is there a way I could make the entire rendering process asynchronous so that the user experience is good.Or is there any other better approach.



Thanks,

Kreez

Hi Kreez, 
  
 I am sorry it looks the first load is slow because map need communication with your SQL database, that’s the reason why it’s slow. 
  
 If you want to improve that, please see whether open cache is possible. Or maybe you can use local data like shape file instead of get data from SQL server. 
  
 Another solution is create a server which generate the map tile, then your application get map tile from server. 
  
 Wish that’s helpful. 
  
 Regards, 
  
 Don

Hi Don ,



Thanks for the quick response . The spatial data loads quite fast when I debug . 



There are a sequence of steps(combination of sync and async  - based on data) that my application runs on default load and binding data to the map component is one of the steps . During this process When the map renders the screen/ other components sort of freeze making it unable to bind them until the map is fully refreshed. All components are bound asynchronously  but I am unable to find a solution where I can make the map render asynchronously.



I hope I made the scenario clear . Let me know if you need more information.



Thanks,

Kreez

Hi Kreez, 
  
 Do you meant you want to load data before map shows when your application initialization but our map cannot do that, if I misunderstand that please let me know. 
  
 If you are using MsSql2008FeatureLayer I don’t think we can load data asynchronously. I think if you knows what’s data you need, you can query the features by your code, then add them to some object like an InmemoryFeatureLayer, when UI shows, you can directly render the InmemoryFeatureLayer, it should looks like load asynchronously. 
  
 Regards, 
  
 Don

Hi Don , 
  
 I mentioned this in my first post in this discussion , 
  
  I am using Map Suite 7.0 and MsSql2008FeatureLayer to load my map.  I use Inmemoryfeaturelayer to load all features of the sql layer 
  
 Which does not load asynchronously. 
  
 Regards, 
 Kreez

Hi Kreez, 
  
 I have some confused about “load”, for MsSql2008FeatureLayer the load should contains query from sql server and render features in map. For Inmemoryfeaturelayer it can save features and render features in map. 
  
 I don’t know how you are using MsSql2008FeatureLayer and Inmemoryfeaturelayer together now, but I meant if you want to load asynchronously, you maybe need ignore MsSql2008FeatureLayer, directly get features from sqlserver when initialization and then save them into Inmemoryfeaturelayer and render them. Do you think that’s possible for your scenario? 
  
 Regards, 
  
 Don

Hi Don,



This is how I convert my MsSql2008FeatureLayer to InMemoryFeatureLayer ; this is already in place and working fine . 



            var sqlLayer = new MsSql2008FeatureLayer(connection, table, Id, SRID);


            InMemoryFeatureLayer inMemLayer = new InMemoryFeatureLayer();
            sqlLayer.FeatureSource.Open();
            var cols = sqlLayer.FeatureSource.GetColumns().ToList();
            foreach (var feature in sqlLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns))
            {
                inMemLayer.InternalFeatures.Add(feature);
            }
            inMemLayer.FeatureSource.Open();
            foreach (var item in cols)
            {
                inMemLayer.Columns.Add(item);
            }
           inMemLayer.FeatureSource.Close();
            sqlLayer.FeatureSource.Close();
 



So I was just wondering if I could do all these map related activities asynchronously and also refresh the map in an async fashion so that the load would look seamless.



Regards,

Kreez

Hi Kreez, 



It looks I still misunderstand you. 



Your code just use MsSql2008FeatureLayer to get features from SQL server but don’t use it to render feature.  



Our map don’t have existing API to load asynchronously for your scenario. But I think you can put the MsSql2008FeatureLayer in an standalone thread to load data, and put the result features to an collection. In your mainly thread, you can use timer or add event like ExtentChanged to check whether the data have been loaded succeed, if succeed you add them to your InMemoryFeatureLayer and refresh map. 



Do you think that will works for you? 



Regards, 



Don