jump to navigation

Trick for solving WCF RIA Services issue.. July 23, 2010

Posted by Jose Luis Latorre Millas in Business Applications, Silverlight, WCF RIA Services.
trackback

I am having the following issue: Sometimes, when I am issuing a DomainService call using WCF RIA Services, I got the callback right but the loadoperation I have assigned has no results, meaning no entities are returned and the “IsComplete” property is false. 

The following code resumes what I am doing, including the LoadOperation definition, the calling function and the callback function: 

LoadOperation lo; 

private void CallDomainService(){ 

DomainContext dc =  new DomainContext(); 

lo = dc.Load(dc.GetDataQuery()); 

lo.Completed += new EventHandler(lo_Completed); 

} 

And it executes well and calls properly lo_completed… 

void lo_Completed(object sender, EventArgs e){ 

     if ((lo != null) && (lo.IsComplete == true)){

      if ((lo.Entities !=null) && (lo.Entities.Count() >= 1))         //Get the returned entity or whatever..

   }

} 

The issue is that I am getting properly the details of the load Operation, but some random times, it does not return the object properly, it is not null but its .IsComplete property is False and the Entities collection is empty, though that it has had been processed properly by the server.

The trick or workaround here is to get, in this exact case, the loadoperation from the server, which is a reference to the right load operation. The code should be like this:

LoadOperation<EntityType> lo2 = (LoadOperation<EntityType>)sender;

if ((lo2.IsComplete) && (lo2.Entities.Count() >= 1)) {

   EntityType Entity = lo2.Entities.First();

 

}

And with this, problem solved.

Are you having this random issue or others? anybody found why this is happening?

Advertisements

Comments»

1. Oleg Kleiman - November 9, 2010

Storing the LoadOperation as a class member to be used between different methods calls is not good idea because is leads to concurrency issues. Such LoadOperation barely can be called “client-side operation” – it’s just wrong concept.
On other hand, Load() method of DomainContext has an overloaded version that receives the callback address that be called upon load completion. This callback receives the right LoadOperation as argument without any “trick” or “workaround”.

Jose Luis Latorre Millas - November 10, 2010

Hi Oleg, Thanks for the information!! 🙂
It is curious that most of the examples I’ve seen are written like this… when I have to use a LoadOperation I always make sure There is no other one running, with a flag/semaphore system so they don’t collide… but you’re right, it’s not as solid as what you are proposing :).
And I agree that this is not only a Client’s work but a Load from the server, so it’s a more complex thing… maybe I haven’t explained properly..
If you could put a simple example, it would be great.

Best,

2. Travis Neale - March 10, 2011

Here’s a simple example using one of the overload methods of the DomainContext.Load Method :

private void Query_Loaded(LoadOperation lo) {
MessageBox.Show(lo.IsComplete.ToString());
}
context.Load(context.GetEntityQuery(), Query_Loaded, null);


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: