У меня есть служба Windows .NET 4.0, которая содержит компоненты. Руководитель нашего проекта говорит, что при вызове методов для определенных компонентов эта производительность снижается. Он подозревает, что это может быть компонент STA, который влечет за собой снижение производительности.
Чтобы проверить эту теорию, меня попросили создать компонент STA, в котором один метод принимает целое число и возвращает целое число, умноженное на два. Этот компонент будет размещен в службе, и будут запущены тесты.
Может ли что-то подобное быть создано в C # или будет необходимо создать это в C ++?
Если возможно, не могли бы вы включить код?
РЕДАКТИРОВАТЬ: (код, основанный на предложении Хана)
using System.Runtime.InteropServices;
namespace STADemo
{
[ComVisible(true)]
public class STAClass
{
public int Calculate(int value)
{
return 2*value;
}
}
}
Служба Windows использует модель потоков MTA. Вы не указали точную модель компонентов COM, которые предположительно вызывают замедление. Если они помечены как 'Apartment'
или же ''
(пусто) в их ThreadingModel
записи реестра, которые могут действительно снизить производительность, поскольку все вызовы будут перенаправляться из текущего потока службы Windows в выделенный поток, созданный COM для размещения компонентов.
Если вам действительно нужно это доказать, вы можете создать однопоточный или квартирный компонент в C #, предоставив пользовательский метод регистрации с [ComRegisterFunction]
, Вот пример использования ComRegisterFunction
пометить компонент как Apartment
,
Обратите внимание, что между однопоточными и многоквартирными компонентами все еще есть небольшая разница в том, как объект фабрики классов обрабатывает многопоточность, как описано в Эта статья. Однопоточные компоненты действительно редки, ваши компоненты, скорее всего, являются однопоточными, но обязательно проверьте их ключи реестра.
Это свойство COM-класса. Вы можете создать его, используя атрибут [ComVisible]. Если вы зарегистрируете его с помощью Regasm.exe, он запишет раздел реестра ThreadingModel. Который устанавливает на «Оба». Вам придется изменить его на «Квартира».
Это не очень разумный способ сделать это, вы просто докажете то, что вы уже знаете: перенаправление вызова из одного потока в другой намного медленнее, чем прямой вызов. Просто используйте вместо этого отладчик. Включите неуправляемую отладку и следите за окном Debug + Windows + Threads. Если вы увидите другое всплывающее окно при выполнении вызова конструктора, у вас будет сигнал, что COM создает вспомогательный поток, чтобы обеспечить COM-компоненту безопасное место. Весьма вероятно, что в сервисе по умолчанию нет потоков STA, если вы сами не создадите их. Вызов Thread.SetApartmentState ().