2009-08-27 2 views
1

Ищете аргумент здесь.Объекты ASP.NET и STA COM

Весь материал я прочитал на использовании COM-объект, созданный в VB из страницы ASP.NET окружает с

ВНИМАНИЕ - УБЕДИТЕСЬ НАДЕВАТЬ ASPCOMPAT ИЛИ ЭТО НЕ БУДЕТ РАБОТАТЬ

http://books.google.co.uk/books?id=-sjg09Crh40C&lpg=PA771&ots=g-vqDun9TR&dq=asp.net%20c%23%20sta&pg=PA771#v=onepage&q=&f=false

Однако ... Я задал это и догадался, что - без проблем.

Теперь я прочитал это

http://msdn.microsoft.com/en-us/library/zwk9h2kb.aspx

и

http://blogs.claritycon.com/blogs/don_peterson/archive/2008/01/17/3621.aspx

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

Может ли кто-нибудь дать окончательный ответ на то, что происходит?

Кроме того, если есть какой-либо способ, которым я мог бы ПРОВЕРИТЬ переключатель между MTA и STA (через некоторую магию отладчика - даже глядя на сборщика!), Я был бы признателен.

Приветствия Дункан

ответ

4

Уверенный, что вы можете использовать компонент VB COM в приложении ASP.NET. Вы думаете, что миллионы строк кода VB не собираются получать любые любовь на .NET-land? :)

Компоненты VB COM известны тем, что компилируются с использованием однопоточной квартиры (STA) - хотя это не всегда так (если я правильно помню).

При использовании компонента STA VB.NET вы можете обнаружить, что вы испытываете:

  1. Медленнее производительности
  2. Возможная утечка памяти из-за заблокированного финализации (не пытается быть все и пессимизма, только, кажется, происходит чаще, чем нет)
  3. потери волос

Простым способом определения MTA v. STA для потока является использование Windbg, подключение к процессу, загрузка SOS и выполнение потоков. Вы увидите результат, похожий на:

0:015> !threads 
ThreadCount: 27 
UnstartedThread: 0 
BackgroundThread: 17 
PendingThread: 0 
DeadThread: 10 
Hosted Runtime: no 
             PreEmptive GC Alloc   Lock 
     ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
    15 1 a28 000d75f0 1808220 Enabled 3823b58c:3823bb08 000d3fe8  0 STA (Threadpool Worker) 
    19 2 43c 000dd5f0  b220 Enabled 00000000:00000000 000d3fe8  0 MTA (Finalizer) 
    20 3 b94 000f20b0 80a220 Enabled 00000000:00000000 000d3fe8  0 MTA (Threadpool Completion Port) 
    21 4 15c 000f5318  1220 Enabled 00000000:00000000 000d3fe8  0 Ukn 

Обратите внимание, что один из потоков имеют «STA» перечисленные в APT колонки. Этот поток является потоком STA, и вы, вероятно, увидите свой код VB COM в стеке вызовов.

Ссылки обсуждают проблему:

Good Lu ск!
Z

1

Если вы можете изменить источник объекта COM, вы можете быть в состоянии определить, является ли его вести себя как в ГНА с помощью простого эксперимента если у вас есть тестовая среда.

  1. Позвоните в сон за некоторое значительное количество времени в компоненте, скажем, 30 секунд и разверните компонент.

  2. Запустите несколько браузеров и нажмите на страницу, требующую компонент из двух браузеров примерно в одно и то же время.

  3. Предполагая, что страница не имеет других значительных недетерминированных задержек, вы должны быть в состоянии определить, является ли это MTA или STA. Если обе страницы возвращаются в одно и то же время (примерно через 30 секунд), компонент работает как MTA. Если кто-то возвращается в 30, а другой в 60, его работает как STA.

Я думаю, что есть способ, чтобы проверить реестр или сам, а также библиотеки DLL, но это было некоторое время, так как я работал в смешанном мире COM/ASP.NET.

Удачи вам!

+0

Спасибо, я только что сделал это. Я положил sleep() на 10 секунд, и они оба вернутся в течение 10 секунд! Это ОПРЕДЕЛЕННО объект VB 6.0 COM. Я зарегистрировал его как сервер COM +. Что происходит?!! – Duncan

+0

Я также осмотрел реестр, и ThreadingModel - это квартира, которая, я считаю, является STA. – Duncan

+0

Объекты не обязательно попадают в одну и ту же квартиру STA (может быть несколько STA для каждого процесса), поэтому тест не совсем прав. Я не уверен, как ASP.NET выделяет STA здесь, однако ... –

Смежные вопросы