MTA, STA,vlákna,Windows service,COM objekt   zodpovězená otázka

VB.NET, Threading

Mám dotaz. Četl jsem články ohledně vícevláknových aplikací a zatím jsem se zde na konkrétní ukázce nesetkal s řešením problému u win služby, s kterým bojuji já.Mám windows service(MTA), která má v OnStart - mimo jiné - spuštění vlákna(které před spuštěním nastavím STA), které poslouchá na UDP. To je mi vše jasné a vše je funkční, ale dále s tím, co odposlouchá musím přes rozhraní od jedné aplikace komunikovat a toto rozhraní neumí více vláken. Potřeboval bych tedy nějak ošetřit konflikty mezi vlákny. Zkoušel jsem již SyncLock,ale bezúspěšně.Metodu,kterou spuštím ve vlákně, stejně jak import samotné rozhraní externí aplikace mám nadefinované v samostatné třídě.Všechny vlastnosti daného objektu externí aplikace které jsou pouze ke čtení, mužu používat.Vše, co jsou metody nebo funkce, nikoli.Jak tedy dál?Je vůbec nějaké řešení?Díky za radu...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jedná se o poměrně složitý problém, u něhož vás bez konkrétního zdrojového kódu mohu tak maximálně odkázat na nastudování této (dosti obsáhlé) problematiky na MSDN:

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrá, zkusím problém blíže přiblížit.Promiňte mi-snad jen drobné -terminologické nepřesnosti.Mám kód, vygenerovaný pro windows service. Nebudu zde deklarovat všechny proměnné, jen snad, že MyClass je instance třídy,kde mám definované další funkce, které používám.V metodě OnStart windows služby mám kód:

IPport = xxx 'port na kterém se poslouchá
MyClass.UDP = New System.Net.Sockets.UdpClient(IPport)
threadReceive = New System.Threading.Thread(AddressOf MyClass.ReceiveMessage)
threadReceive.SetApartmentState(ApartmentState.STA)
threadReceive.Start()

Pokud tomu správně rozumím, z tohota hlavního vlákna, ve kterém běží samotná windows service(v režimu MTA) se odštěpí vlákno, které poslouchá na určitém portu UDP komunikaci. S tím problém zatím není. Vlákno pěkně poslouchá...

V instanci třídy MyClass, mám kód:

Public Sub ReceiveMessage() 
SyncLock GetType(WorkClass) 'WorkClass je název třídy
Do While ContinueListen = True
 Try
 Dim REP As New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
 Dim receiveBytes As [Byte]() = UDP.Receive(REP)
 BitDet As BitArray
 BitDet = New BitArray(receiveBytes)
 strReturnData=System.Text.Encoding.ASCII.GetString(receiveBytes)
 UDPrecieved(strReturnData)
Catch ex As Exception
'zápis chyby do souboru
End Try
Loop
End SyncLock
End Sub

Public Sub UDPrecieved(ByVal strReturnData As System.String)
'zde je kód, kde mám definovanou novou instanci COM objektu aplikace třetí strany, který musím využívat a který neumí MTA režim. Této instanci COMu posílám data získaná přes UDP
End Sub

Tak jak tomu rozumím, nejlepší by bylo, aby se ke COM objektu přistupovalo jednotlivě, tj.vždy až vlákno skončí.Jak toho docílit?Nebo se na danou problematiku dívám zcela špatně?A mám nadeklarovat novou instanci COM objektu v hlavním vlákně?Do jaké metody (onStart atd.) ho ale potom dát a jak k němu přistupovat, aby se mu předávaly data z vedlejších vláken, která poslouchají UDP komunikaci?

Snad jsem problém vysvětlil lépe než v předchozím dotazu.Doufám, že reakce bude přínosem nejen pro mě,ale i pro ostatní, kteří mají pocit,že této problematice hlavního a vedlejších vláken nerozumí tak přesně jak by si představovali.

Děkuji za věnovaný čas

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Řeším něco podobného a taky si nevím moc rady. Pomůžete někdo?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback