Perhaps its time to think : why the ISession is not thread safe ? May be you can discover that the work to do to make it thread-safe is not so hard. Which part of the session-state is not thread safe ? The weakest class, in term of thread safety, is the StatefulPersistenceContext; make it thread safe and you have most of the problem solved ;)
Great work team, great work. Abrazos a todos. On Saturday, May 6, 2017 at 5:00:14 AM UTC-3, Boštjan Markežič wrote: > > Here we need to consider one important thing, ISession is not thread safe > so using Task.WhenAll could be very dangerous as the ISession instance is > passed to the event listeners. > In my opinion the version with a for loop is the way to go as we are mimic > the exact behavior as doing it synchronously, the only difference is that > the next event listener may be executed in a different thread because of > ConfigureAwait(false). If the ISession relies on the thread context then we > should remove also the ConfigureAwait(false) call. > IMHO almost nobody is using more than one event listener of the same type, > even if they do, the number will be very small so using the Task.WhenAll is > not necessary here. > > Best Regards, > Boštjan > > Dne sobota, 06. maj 2017 02.28.09 UTC+2 je oseba Alexander Zaytsev > napisala: >> >> Thanks, Boštjan >> >> Funny :) I'm asking in a context of AsyncGenerator. So, it's how the >> listeners are currently invoked (an example based on >> OnPersistEventListener): >> >> private void FirePersistAsync(IDictionary copiedAlready, PersistEvent >> @event) >> { >> using (new SessionIdLoggingContext(SessionId)) >> { >> CheckAndUpdateSessionStatus(); >> var persistEventListener = listeners.PersistEventListeners; >> for (int i = 0; i < persistEventListener.Length; i++) >> { >> persistEventListener[i].OnPersistAsync(@event, copiedAlready); >> } >> } >> } >> >> And this is how the AsyncGenerator converts it to async: >> >> private async Task FirePersistAsync(IDictionary copiedAlready, >> PersistEvent @event) >> { >> using (new SessionIdLoggingContext(SessionId)) >> { >> CheckAndUpdateSessionStatus(); >> var persistEventListener = listeners.PersistEventListeners; >> for (int i = 0; i < persistEventListener.Length; i++) >> { >> await (persistEventListener[i].OnPersistAsync(@event, >> copiedAlready)).ConfigureAwait(false); >> } >> } >> } >> >> Which is nonoptimal. The code here asynchronously invokes the listeners >> sequentially one >> by one. >> I would like to invoke them simultaneously instead by Task.WhenAll: >> >> private async Task FirePersistAsync(IDictionary copiedAlready, >> PersistEvent @event) >> { >> using (new SessionIdLoggingContext(SessionId)) >> { >> CheckAndUpdateSessionStatus(); >> >> var listeners = listeners.PersistEventListeners >> .Select(l => l.OnPersistAsync(@event, >> copiedAlready).ConfigureAwait(false)); >> >> await Task.WhenAll(listeners).ConfigureAwait(false); >> } >> } >> >> So, if anyone is expecting some interdependencies or sequential order of >> invocations between the listeners we would not be able to do so. >> >> Best Regards, >> Alexander >> >> On Sat, May 6, 2017 at 12:15 AM, Boštjan Markežič <markezic...@gmail.com> >> wrote: >> >>> Hi Alexander, >>> >>> Yes, I am using two IPreUpdate event listeners in a single >>> ISessionFactory. One >>> <https://github.com/maca88/SharperArchitecture/blob/master/Source/SharperArchitecture.DataAccess/NHEventListeners/AuditEntityEventListener.cs> >>> >>> is updating the entity audit properties and the other >>> <https://github.com/maca88/SharperArchitecture/blob/master/Source/SharperArchitecture.DataAccess/NHEventListeners/ValidatePreInsertUpdateDeleteEventListener.cs> >>> >>> is executing the validation for the entity. >>> The order somehow matters in this case as I want the validation event >>> listener to be executed as last after all properties are populated. >>> If you intend to drop support for registering multiple listeners of the >>> same type it won't be a problem for me as I can still create my own >>> mechanism to spread the event across the system if needed. >>> That is just my opinion. >>> >>> Best Regards, >>> Boštjan >>> >>> >>> >>> Dne četrtek, 04. maj 2017 15.38.07 UTC+2 je oseba Alexander Zaytsev >>> napisala: >>> >>>> Hi, >>>> >>>> I want to know if anyone here expects EventListener of* the same type *to >>>> run in a particular order. >>>> >>>> Does anyone have ever implemented and registered two event listeners of >>>> *the >>>> same type *to the single ISessionFactory? >>>> >>>> Best Regards, >>>> Alexander >>>> >>> -- >>> >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "nhibernate-development" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to nhibernate-development+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- --- You received this message because you are subscribed to the Google Groups "nhibernate-development" group. To unsubscribe from this group and stop receiving emails from it, send an email to nhibernate-development+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.