Ukončení Threadu   zodpovězená otázka

VB.NET, Threading

Zdravím,

přecházím z VB6 na VB2005. Snažím se proniknout do Threadů a mám tento dotaz:

Mám MainForm jako hlavní vlákno. Butonem spustím NovéVlákno, kde se provede nějaký cyklus. Po dokončení cyklu NovéVlákno jsem očekával, že tím se vlákno ukončí. Ovšem při zavření MainFormu (i po ukončení NovéVlákno) mi aplikace zůstane nějak viset. Předpokládm, že je třeba NovéVlákno nějak ukončit. Prosím o radu jak a odkud NovéVlákno ukončit. Samozřejmě jsem experimentoval a hledal, ale nic mi nefunguje.

Předem děkuji.

Class frmMain

  Button1_Click
   Dim UD As New System.Threading.Thread(AddressOf UploadData)
   UD.Name = "UploadData"
   UD.Start()
  End Sub

  Private Sub UploadData()
   cyklus..
   'jak se tohoto vlákna zbavit po dokončení cyklu?
  End Sub

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

K ukončení Threadu se používá metoda Abort na vlákně, kter= si přejete ukončit, ve Vašem případě tudíž na konci metody UploadData.

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

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

To sice ano, ale jak jsem už psal - je to násilné řešení.

A na konec metody UploadData se nedává.

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

Možnosti jsou v zásadě 3:

1. Vlákno natvrdo ukončit zavoláním Abort. Je to násilné řešení a nedoporučuji ho použít, pokud vlákno třeba pracuje se soubory atd., je netriviální ho abortnout tak, aby po sobě korektně uklidilo.

2. Pomocí nějakého synchronizačního primitiva řeknete vláknu, že se má ukončit. Vlákno uvnitř cyklu kontroluje, jestli neobdrželo požadavek na ukončení, a pokud ano, tak z cyklu vyskočí, uklidí a skončí.

Je to asi řešení, doporučuji - to, kdy vlákno skončí, si regulujete sám.

3. Nastavte vlákno jako Background (dělá se to nějakou vlastností na té proměnné UD). Aplikace se po zavření okna ukončí a vlákno bude předčasně zrušeno (prvním způsobem, abortem, takže opět moc nedoporučuji).

Pokud používáte .NET verze 4, můžete použít třídu Task, která slouží právě pro snazší implementaci těchto operací na pozadí a podporuje i předčasné rušení úkolů.

Anebo použijte komponentu BackgroundWorker, která existuje už od .NETu verze 2, je to lepší, než se ručně patlat s vlákny, alespoň ze začátku.

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

Už to mám vyřešeno. Soustředil jsem se na vlastní vlákno, s čímž teprve začínám. Problém byl ale v tom, že uvnitř vlákna používám Inet control - tu jsem nejprve musel ukončit Inet.Cancel().

Děkuji za reakce.

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

Vlákno je standardně nastaveno jako vlákno na popředí, proto zůstane aplikace v procesech běžet i po ukončení. Abyste tomuto předešel, nastavte vláknu IsBackground na True.

nahlásit spamnahlásit spam 1 / 1 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