VB.NET & STA
9 отговора
344 прегледа
VB.NET & STA
Значи имам следното двоумение...
Ако си правя компонент (без GUI) с VB.NET, за какви модели мога да го компилирам/конфигурирам: STA, MTA и тнт.. Кои са by default и за кои трябва да правя някакви трикове.
Благодаря предварително.
Ако си правя компонент (без GUI) с VB.NET, за какви модели мога да го компилирам/конфигурирам: STA, MTA и тнт.. Кои са by default и за кои трябва да правя някакви трикове.
Благодаря предварително.
Re: VB.NET & STA
за vb точно не знам щото предпочитам с# ама по принцип by default е STA, което значи че средата се грижи за синхронизацията, а ако искаш можеш да си го направиш MTA, което значи че ти ще трябва да се грижиш за синхронизацията, което не става с трикове така че е по-добре да го избягваш, идеята е че MTA дава повече пърформанс щото нямаш прокси стъбове и методите се извикват асинхронно
XM TurboCT .. where comfort meets power
XM TurboCT .. where comfort meets power
Re: VB.NET & STA
Знаех си, че ти ще отговориш.
Но целта е МТА.
А с С# - не е ли МТА по подразбиране?
Мерси.
Re: VB.NET & STA
tc ...;)
po podrazbirane e kakvoto si napishesh da e ...[{S}|{M}TAThread] / <{S}|{M}TAThread()> za VB fenovete
po podrazbirane e kakvoto si napishesh da e ...[{S}|{M}TAThread] / <{S}|{M}TAThread()> za VB fenovete
Re: VB.NET & 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
Като ползваш 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
Re: VB.NET & STA
Демек под VB.NET мога да пиша МТА компоненти
.
Мерси!
ПП. не че веднага сядам, но ме интересуваше възможността. А отговорът е повече от ясен.
Мерси!
ПП. не че веднага сядам, но ме интересуваше възможността. А отговорът е повече от ясен.
Re: VB.NET & STA
Мерси за изчерпателните обяснения.
Все пак ако пиша нещо сериозно бих го написал на С++
.
Все пак ако пиша нещо сериозно бих го написал на С++
Re: VB.NET & STA
ГАЙ-а по-лесно и най-важното по-бързо би станал на Ц#, ако има сметки (не нямам предвид само числени изчисления) или някакви по-тежки обработки Ц++ е решението - по-бързичко е засега. Доста.
Re: VB.NET & STA
лонг лив Ц++ енд Бярне Струвструп форевър .....;)
There are 10 types of people in this world one who understand binary jokes and one who not
There are 10 types of people in this world one who understand binary jokes and one who not