/ / Створення пулу робочих потоків для коду, що не захищає потоки - .net, паралельність, безпека потоків, appdomain, worker-process

Створення пулу потоків для робочого коду, який не є безпечним для потоків.

Який найкращий спосіб обернути код, що не захищає потоки, у фреймворк .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

Що можна сказати про синглтон, що містить лише один екземпляр робочого об’єкта плюс черга запитів?