|
Тема |
Re: VB.NET & STA [re: aджaмия] |
|
Автор |
шeф нa Coди Дeвня (full optional) |
|
Публикувано | 25.11.03 23:42 |
|
|
Значи, както казах като ползваш 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
|
| |
|
|
|