VB.NET & STA

9 отговора 344 прегледа
#1

VB.NET & STA

Значи имам следното двоумение...

Ако си правя компонент (без GUI) с VB.NET, за какви модели мога да го компилирам/конфигурирам: STA, MTA и тнт.. Кои са by default и за кои трябва да правя някакви трикове.

Благодаря предварително.

Отговор
в отговор на aджaмия #2

Re: VB.NET & STA

за vb точно не знам щото предпочитам с# ама по принцип by default е STA, което значи че средата се грижи за синхронизацията, а ако искаш можеш да си го направиш MTA, което значи че ти ще трябва да се грижиш за синхронизацията, което не става с трикове така че е по-добре да го избягваш, идеята е че MTA дава повече пърформанс щото нямаш прокси стъбове и методите се извикват асинхронно


XM TurboCT .. where comfort meets power
Отговор
в отговор на шeф нa Coди Дeвня #3

Re: VB.NET & STA


Знаех си, че ти ще отговориш.

Но целта е МТА.
А с С# - не е ли МТА по подразбиране?

Мерси.

Отговор
в отговор на aджaмия #4

Re: VB.NET & STA

tc ...;)

po podrazbirane e kakvoto si napishesh da e ...[{S}|{M}TAThread] / <{S}|{M}TAThread()> za VB fenovete

Отговор
в отговор на aджaмия #5

Re: VB.NET &amp; STA

Значи, както казах като ползваш VB.NET, default Threading model ти е STA, и компилатора изплюва необходимия код да инициализира STA преди да почне да се изпълнява какъвто и да е било код.

Като ползваш C# компилатора не генерира такъв код и апликацията ползва дефолтния и единствен MTA инициализиран от CLR.

Ако се съмняваш в думите ми, можеш лесно да го пробваш с този код:

If System.Threading.Thread.CurrentThread.ApartmentState = System.Threading.ApartmentState.STA Then
......
End If


Почти съм убеден че точно в този момент викаш "Еврика" и сядаш да пишеш следния код:

System.Threading.Thread.CurrentThread.ApartmentState = System.Threading.ApartmentState.MTA

Но помни че първата идея макар и първоначално изглеждаща гениална може би не е най-уместната ;-)

Значи, един тред може да инициализира COM apartment само веднъж. Тъй като рънтайма прави това преди да изпълни unmanaged code от този тред, ти трябва да сетнеш ApartmentState възможно най-рано. Ако се забавиш случайно, и го промениш след като апартмента е бил инициализиран, твоето сетване няма да промени абсолютно нищо, тъй като апартментите нямат такива свойства да си сменят стейта от време на време по прищавка на програмиста ;-)

За това ти трябва план Б: <MTAThread()>

По-добре е да ползваш MTAThreadAttribute, защото чрез този атрибут апартмента се сетва преди да почне да се изпълнява какъвто и да е било код. Иначе трябва ти да се грижиш да го сетнеш възможно най-бързо.

Не съм писал на вижуал бейсик и не знам доколко е добра идея да ползваш МТА, ама ти си знаеш. Успех.


XM TurboCT .. where comfort meets power
Отговор
в отговор на synchu #6

Re: VB.NET &amp; STA

Демек под VB.NET мога да пиша МТА компоненти .

Мерси!

ПП. не че веднага сядам, но ме интересуваше възможността. А отговорът е повече от ясен.

Отговор
в отговор на шeф нa Coди Дeвня #7

Re: VB.NET &amp; STA

Мерси за изчерпателните обяснения.

Все пак ако пиша нещо сериозно бих го написал на С++

.

Отговор
в отговор на aджaмия #8

Re: VB.NET &amp; STA

ГАЙ-а по-лесно и най-важното по-бързо би станал на Ц#, ако има сметки (не нямам предвид само числени изчисления) или някакви по-тежки обработки Ц++ е решението - по-бързичко е засега. Доста.

Отговор
в отговор на synchu #9

Re: VB.NET &amp; STA

12 год. С++

Отговор
в отговор на aджaмия #10

Re: VB.NET &amp; STA

лонг лив Ц++ енд Бярне Струвструп форевър .....;)

There are 10 types of people in this world one who understand binary jokes and one who not
Отговор