Могу ли я использовать не многопоточную библиотеку в многопользовательском веб-приложении .NET? - PullRequest
1 голос
/ 04 августа 2009

Для нового проекта веб-приложения, использующего .NET, существующая библиотека (написанная на C #) будет доступна онлайн, которая выполняет некоторые вычисления для информации в модели данных.

Библиотека должна быть доступна для многих пользователей одновременно. Каждый пользователь будет работать с другим набором данных. Пользователи также могут изменять данные модели и повторять вычисления с измененными входными параметрами.

В настоящее время библиотека может обрабатывать только одну модель данных одновременно. (Предположим, есть проблемы с дизайном, такие как статические классы и синглтоны).

Если веб-приложение .NET (простой веб-интерфейс, использующий веб-страницы HTML) хочет использовать эту библиотеку, существует ли технология, позволяющая создать отдельный экземпляр библиотеки для каждого клиента, чтобы разделить модели и другие параметры

Ответы [ 6 ]

1 голос
/ 09 июня 2012

Вы можете загрузить данную библиотеку в отдельные домены приложений. Таким образом, вы можете иметь несколько одноэлементных экземпляров, каждый из которых изолирован в домене приложения.

Джеффри Рихтер "Использование доменов приложений для создания не поточно-безопасного кода Threadsafe"

1 голос
/ 04 августа 2009

Вы можете загрузить модуль извне и каждый раз создавать новый экземпляр или использовать пул объектов, используя .NET Enterprise Services (COM +), но если объект находится в состоянии, вы все равно будете проблемы масштабируемости.

За комментарий: Да, вы можете. Проверьте этот пример , для быстрого старта.

0 голосов
/ 04 августа 2009

Если вы говорите о компоненте, который не настроен для обеспечения безопасности в многопоточной среде, тогда ответ - да. Однако вы должны выбрать механизм, который «синхронизирует» доступ к компоненту. Самая простая форма в C # - это синтаксис блокировки.

Если вы говорите о компоненте, который допускает только один экземпляр за раз, тогда ответ - нет. Это связано с тем, что веб-приложения являются многопоточными. Использование его в asp.net потребует от вас блокировки всего сервера в ожидании завершения работы компонента, что, как правило, плохо. Мое лучшее решение для этого состоит в том, чтобы сделать использование такого компонента асинхронной операцией. Разрешить пользователю указывать входные параметры, затем сохранять эти данные где-нибудь и использовать какой-либо планировщик для обработки данных по одному. Когда процесс завершится, уведомите пользователя, что работа выполнена и т. Д.

Кроме того, когда компоненту требуется много времени для обработки, лучше все равно не позволять пользователю взаимодействовать с компонентом синхронно.

0 голосов
/ 04 августа 2009

Большинство классов .NET Framework не предназначены для многопоточного доступа, как вы можете видеть в MSDN.

Если вы говорите, что ваши пользователи работают с разными наборами данных, то ваша программа должна создавать экземпляры классов в библиотеке для каждого пользователя - для меня это не проблема.

Очень важно, если бы многие пользователи работали с одним и тем же набором данных, вам пришлось бы позаботиться о многопоточности библиотеки.

0 голосов
/ 04 августа 2009

Вы можете использовать блокировку, например:

lock (typeof(YOUR_MODEL_CLASS))
{
}

или попробуйте поставить в очередь вычисления, сохраните параметры в файле базы данных и запустите службу и выполняйте каждый расчет в свое время.

Будет порог, при котором он будет стабильным / пригодным для использования.

0 голосов
/ 04 августа 2009

Если вы хотите, чтобы пользователи совместно использовали одноэлементный объект в вашем экземпляре приложения asp.net, его необходимо реализовать с безопасностью потоков для любого вида доступа и изменений.

Вы можете создать оболочку для использования и управления экземплярами библиотеки.

...