Який найкращий спосіб обернути код, що не захищає потоки, у фреймворк .net?
У мене є стороння бібліотека, яка не є потокомбезпечний завдяки використанню статичних змінних. Переписувати його не можна. Ця бібліотека використовується веб-службою asp.net, яка отримує багато одночасних дзвінків.
На даний момент я його обгорнув у проксі-клас, який використовує блокування для забезпечення безпеки потоків:
private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
lock (oneThreadAtATimePlease)
{
return new UnsafeLibrary(someValue).DoSomething();
}
}
Продуктивність низька, оскільки кілька абонентів повинні чекати блокування, але результати правильні.
Я хотів би покращити продуктивність, запустивши кілька екземплярів цієї бібліотеки, кожен у своєму власному AppDomain. Чи є це обґрунтованим підходом? Будь-який хороший зразок коду, щоб рекомендувати?
Відповіді:
2 для відповіді № 1Ви також можете спробувати створити програму на основі повідомлень за допомогою черги.
Тоді декілька потоків можуть робити запити в черзі, а один потік може працювати в цій черзі та повідомляти інші потоки про результати. Використання класу монітора не завжди є найшвидшим способом.
Домени App - це варіант. Однак вам доведеться мати справу з МПК.
0 для відповіді № 2
Статичний конструктор допоможе вам:
Статичні конструктори гарантовано запускаються лише один раз для кожного домену програми ...
0 для відповіді № 3
Що можна сказати про синглтон, що містить лише один екземпляр робочого об’єкта плюс черга запитів?