.NET i takie tam

STAThreadAttribute

with 3 comments

W aplikacji portowanej z .NET 1.1 do .NET 2.0 niektóre operacje kopiowania do schowka czy otwierania standardowego dialogu do wyboru pliku, powodują wyjątek:

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.’

Co dziwniejsze problem zawsze występuje gdy aplikacja jest kompilowana w trybie ‚Debug‚, przy kompilacji w trybie ‚Release’ błąd owszem pojawia się, ale już nie za każdym razem.

Gdzie tkwił błąd? Otóż, wykonywać odwołania OLE (a widać mamy takie gdy korzystamy z Ctrl+C) – możemy tylko z wątku który działa w trybie Single Thread Apartment (STA), natomiast .NET 2.0 domyślnie tworzy wszystkie wątki w trybie Miltithread Apartment (MTA).

Aby pozbyć się problemu, dla aplikacji jednowątkowej wystarczy dodać atrybut [STAThreadAttribute] do naszej funkcji Main() (atrybut działa tylko i wyłącznie dla tej funkcji). Natomiast jeśli korzystamy z błogosławieństwa/przekleństwa (niepotrzebne skreślić😉 ) wielowątkowości – każdy wątek musimy ręcznie przestawić w tryb STA, np:

Thread th = new Thread(new ThreadStart(DoSth));
th.SetApartmentState(ApartmentState.STA);
th.Start();

Written by sakowicz

Lipiec 3, 2007 @ 7:49 am

Napisane w .NET

Odpowiedzi: 3

Subscribe to comments with RSS.

  1. tego potrzebowałem, dzięki

    Przemek

    Marzec 21, 2008 at 1:04 pm

  2. dzieki, przydalo sie:)
    krotko i na temat;)

    kejsu

    Kwiecień 27, 2009 at 5:23 pm

  3. uratowałeś mnie ;D Dzięki!

    szymon

    Lipiec 27, 2011 at 1:43 pm


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: