Vytvoření vlákna bez dalšího možného přístupu k němu   zodpovězená otázka

C#, Threading

Dobrý den,

doposud jsem se nikdy nevěnoval multithreadovým operacím a ač jsem našel mnoha článku na téma vlákna, odpověď na toto nikde:

Je správný (vhodný) postup vytvořit a spustit vlákno uvnitř bloku metody?

Jakmile se metoda ukončí, pak už nikdy vlákno nepůjde dohledat (join, abort atp). Pokud tedy tyto metody nehodlám použít, vadí to nebo se to řeší nějak jinak?

Díky za případné odpovědi

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

Nějak jsem nepochopil to "vytvořit a spustit vlákno uvnitř metody"... Spustíte vlákno, v tom vlákně se něco vykoná a vlákno skončí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
        public void SpustVlaknoVMetode()
        {
            //činnost před spuštěním vlákna

            Thread T = new Thread(NejakaFunkce);
            T.IsBackground = true;
            T.Start();

            //činnost po spuštění vlákna
        }

       

metoda skončí, ale vlákno žije dál (může třeba na něco čekat nebo tam běžet nějaký cyklus)

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

Záleží na konkrétním scénáři. Podle délky lze ale odlišit dva typy operací:

1) Short-Running operace

Pro krátké operace se v první řadě vůbec nedoporučuje vytvářet vlastní vlákno. Doporučený způsob je používat třídu Task, knihovnu TPL a obdobné principy vyšší úrovně abstrakce.

Objekt Task, reprezentuje stav dané operace a v závislosti na konkrétním scénáři může sloužit ke zjišťování např. zda operace již skončila (a zda úspěšně), cancelování apod.

2) Long-Running operace

Pro dlouho běžící operace může mít smysl (vhledem k vysoké režii) vytvářet vlastní vlákno. Protože se ale jedná o dlouho běžící operaci nebude mít pravděpodobně s metodou, která jej vytvořila co se týče životnosti nic společného tj. vlákno bude žít dlouho potom co tato metoda skončila.

Nicméně i u takové operace potřebujeme velmi často řešit nějakou interakci operace s okolím.

Například se může jednat o nějaký interní logický proces nějaké komponenty, který běží pořád dokud do komponenta sama neukončí. Jindy je potřeba reportovat, že operace stále běží apod.

Ve všech těchto případech bych vlastní vlákno zapouzdřil do vlastní třídy, která bude řešit jeho životní cyklus a interakci s okolím.

Například pro případ vlákna s životností stejnou jako komponenta, bych příslušnou třídu udělal IDisposable:

internal sealed class Process : IDisposable
{
    private readonly CancellationTokenSource ProcessCancellation; 
    private readonly Thread ProcessThread;
    private bool IsDisposed;

    public Process()
    {
        this.ProcessCancellation = new CancellationTokenSource(); 
        this.ProcessThread = new Thread(() => ProcessThreadProc(this.ProcessCancellation.Token));
        this.ProcessThread.Start();
    }

    public void Dispose()
    {
        if (!this.IsDisposed)
        {
            this.ProcessCancellation.Cancel();
            this.ProcessThread.Join();
            this.ProcessThread.Dispose();
            this.IsDisposed = true;
        }
    }

    private static void ProcessThreadProc(CancellationToken cancelToken)
    {
        while (true)
        {
            if (cancelToken.IsCancellationRequested)
            {
                return;
            }

            //...
        }
    }
}
nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji za odpověď

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