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č <[email protected]>
>> 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 [email protected].
>>> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.