c# - DevForce doesn't always fire Queued Events if they are queued during a call to FireQueuedEvents -
we running cases change property on our entity propertychanged
event doesn't fire. doing logic part of save , problem seems way devforce queues events during save.
looking @ code loadingblock.dispose(), see this:
public void dispose() { this._entitymanager.firequeuedevents(); this._entitymanager.isloadingentity = this._wasloadingentity; }
there race condition there fire queued events before changing isloadingentity
property. means new events generated during firequeuedevents queued (since isloadingentity
still true) events queued never fired since fired queued events (that knew about). seems devforce should reset isloadingentity flag before firing events. think solve our problems.
here code might explain our case. i'll use merge call instead of savechanges since it's easier use in unit test:
//create main entity manager , test entity var em = new entitymanager(); var entity = new myentity {sid = 123}; em.attachentity(entity); //create second copy of entity , entity manager - // can trigger merge , see bad behavior var copy = new myentity { sid = 123, mergecount = 20 }; var em2 = new entitymanager(); em2.attachentity(copy); //this code bit contrived it's similar doing in our actual app em.entitychanged += (sender, args) => { //if myentity changed , merge, increment mergecount property var e = args.entity myentity; if (e != null && args.action == entityaction.changecurrentandoriginal) { e.mergecount++; } }; //set propertychanged event handler see properties got changed (according inotifypropertychanged) var propertieschanged = new list<string>(); entity.propertychanged += (sender, args) => { propertieschanged.add(args.propertyname); }; //merge copy entity em2.cachestatemanager.getcachestate().merge(em, restorestrategy.normal); //at point, mergecount property 21 - expected assert.areequal(21, entity.mergecount); //we should have seen propertychanged event mergecount since changed property (it 20 , set 21) assert.istrue(propertieschanged.contains("mergecount")); //in debugger, if @ em._queuedevents, we'll see items in there. 1 of items propertychanged event // mergecount. 'fired' queued...and queued forever because loadingblock long gone.
i've found can merge empty entity manager , cause queued events fire. okay workaround in 1 case ran this. fear there might other places running issue , workaround won't work us.
you're right isloadingentity flag should cleared @ beginning of dispose logic, , we'll open bug report this.
if you're able use entitychanging event instead of entitychanged might workaround try. changing event isn't queued, execution of handler causes propertychanged event processed before loadingblock disposed.
Comments
Post a Comment