/ / Budovanie fondu pracovných vlákien pre kód, ktorý nie je bezpečný pre vlákna - .net, súbežnosť, bezpečnosť vlákien, appdomain, worker-process

Budovanie pracovník vlákno bazén pre vlákno bezpečný kód - .net, súbežnosť, bezpečnostné vlákno, appdomain, pracovného procesu

Aký je najlepší spôsob zabalenia kódu, ktorý nie je bezpečný pre vlákna, v rámci .net?

Mám knižnicu tretej strany, ktorá nie je vláknobezpečné vďaka použitiu statických premenných. Prepísanie nie je možné. Túto knižnicu používa webová služba asp.net, ktorá prijíma veľa súčasných hovorov.

Momentálne to mám zabalené v triede proxy, ktorá používa zámky na zaistenie bezpečnosti vlákna:

private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
lock (oneThreadAtATimePlease)
{
return new UnsafeLibrary(someValue).DoSomething();
}
}

Výkon je slabý, pretože na blokovanie musí čakať viac volajúcich, ale výsledky sú správne.

Chcel by som zlepšiť výkon spustením viacerých inštancií tejto knižnice, každú vo svojej vlastnej AppDomain. Je to rozumný prístup? Odporúčam nejaký dobrý ukážkový kód?

odpovede:

2 pre odpoveď č. 1

Môžete sa tiež pokúsiť vytvoriť aplikáciu založenú na správach pomocou frontu.

Potom mohlo viac vlákien žiadať fronty a jedno vlákno mohlo pracovať v tomto fronte a informovať ostatné vlákna o výsledkoch. Používanie triedy monitora nie je vždy najrýchlejší spôsob.

AppDomains sú možnosťou. Budete sa však musieť vysporiadať s IPC.


0 pre odpoveď č. 2

Statický konštruktor vám pomôže:

Je zaručené, že statické konštruktory budú spustené iba raz na doménu aplikácie ...


0 pre odpoveď č. 3

A čo Singleton, ktorý obsahuje iba jednu inštanciu pracovného objektu a rad žiadostí?