Очевидно е, че задействането на събития вътре в ключалка (т.е. критична секция) е предразположено към блокиране поради възможността манипулаторът на събития да блокира някои асинхронни операции, които също трябва да придобият същата ключалка. Сега, по отношение на дизайна, има две възможни решения, които ми идват на ум:
Ако е необходимо да се задейства събитие вътре в ключалка, тогава винаги задействайте събитието асинхронно. Това може да се извърши с помощта на ThreadPool, например, ако редът на задействане на събитията няма значение. Ако редът на събитията трябва да бъде запазен, тогава може да се използва единична нишка за задействане на събития за задействане на събитията по ред, но асинхронно.
Класът/библиотеката, която задейства събитията, не трябва да предприема необходимите предпазни мерки, за да предотврати блокировката и просто задейства събитието вътре в заключването. В този случай отговорност на манипулатора на събитието е да обработи събитието асинхронно, ако извършва заключване (или друга блокираща операция) вътре в манипулатора на събитие. Ако манипулаторът на събития не отговаря на това правило, тогава той трябва да понесе последствията в случай, че възникне блокиране.
Честно казано смятам, че вторият вариант е по-добър от гледна точка на принципа за разделяне на проблемите, тъй като кодът за задействане на събитие не трябва да предполага какво може или не може да направи манипулаторът на събитието.
На практика обаче съм склонен да поема по първия маршрут, тъй като втората опция изглежда се сближава до точката, че всеки манипулатор на събития сега трябва да изпълнява целия код за обработка на събития асинхронно, тъй като през повечето време не е ясно дали някои серии извиквания извършва блокираща операция или не. За сложни манипулатори на събития, проследяването на всички възможни пътища (и, освен това, следенето им с развитието на кода) определено не е лесна задача. Следователно решаването на проблема на едно място (където се задейства събитието) изглежда за предпочитане.
Интересувам се да видя дали има други алтернативни решения, които може да съм пренебрегнал и какви възможни предимства/недостатъци и клопки могат да бъдат приписани на всяко възможно решение.
Има ли най-добра практика за този вид ситуация?