NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
beats.omni
Člen
Avatar
beats.omni:8.12.2015 16:31

V prvním případě si vytvořím tři tásky a počkám, až se dokončí, než budu pokračovat v hlavním vlákně aplikace dál:

class Example_01
    {
        public void DoSomeVeryImportantWork(int id, int sleepTime)
        {
            Console.WriteLine($"Task {id} is beginning...");
            Thread.Sleep(sleepTime);
            Console.WriteLine($"Task {id} is completed.");
        }

        public void DoSomeOtherVeryImportantWork(int id, int sleepTime)
        {
            Console.WriteLine($"Task {id} is beginning more work...");
            Thread.Sleep(sleepTime);
            Console.WriteLine($"Task {id} is completed more work.");
        }
    }

static void Main(string[] args)
   {
            Example_01 ex1 = new Example_01();

            Task t1 = Task.Factory.StartNew(() => ex1.DoSomeVeryImportantWork(1, 1500));
            Task t2 = Task.Factory.StartNew(() => ex1.DoSomeVeryImportantWork(2, 3000));
            Task t3 = Task.Factory.StartNew(() => ex1.DoSomeVeryImportantWork(3, 100));

            Task.WaitAll(t1, t2, t3) // Počká na dokončení tásků, a pak pokračuje dále

            Console.WriteLine("Dokončeno...");
            Console.ReadKey();

   }

V druhém příkladu využiji async/await a budu chtít dosáhnout toho samého. Tady ale narážím na problém, že nevím, jak počkat na dokončení všech tásků, než budu pokračovat v hlavním vlákně dál.

class Example_01
    {

        public Task DoSomeVeryImportantWorkAsync(int id, int sleepTime)
        {
            return Task.Factory.StartNew(() => DoSomeVeryImportantWork(id, sleepTime));
        }

        public Task DoSomeOtherVeryImportantWorkAsync(int id, int sleepTime)
        {
            return Task.Factory.StartNew(() => DoSomeVeryImportantWork(id, sleepTime));
        }

        private void DoSomeVeryImportantWork(int id, int sleepTime)
        {
            Console.WriteLine($"Task {id} is beginning...");
            Thread.Sleep(sleepTime);
            Console.WriteLine($"Task {id} is completed.");
        }

        private void DoSomeOtherVeryImportantWork(int id, int sleepTime)
        {
            Console.WriteLine($"Task {id} is beginning more work...");
            Thread.Sleep(sleepTime);
            Console.WriteLine($"Task {id} is completed more work.");
        }
    }

static void Main(string[] args)
        {
            CallMethod();
            // Jak počkat na dokončení tasků, než budu pokračovat dál?

            Console.WriteLine("Dokončeno...");
            Console.ReadKey();
        }

        static async void CallMethod()
        {
            Example_01 ex1 = new Example_01();
            await ex1.DoSomeVeryImportantWorkAsync(1, 2500);
            Console.WriteLine("Async Metoda skončila...");
            await ex1.DoSomeOtherVeryImportantWorkAsync(2, 3000);
            Console.WriteLine("Async Metoda 2 skoncila...");

        }
 
Odpovědět
8.12.2015 16:31
Avatar
Gramli
Tvůrce
Avatar
Gramli:8.12.2015 19:21

Nejjednoduseji:

static void Main(string[] args)
        {
                bool end = false;
            CallMethod(ref end);
            // Jak počkat na dokončení tasků, než budu pokračovat dál?

        while(true)
        {
                if(end)
                {
                        //vim, ze skoncily
                        break;
                }
        }
            Console.WriteLine("Dokončeno...");
            Console.ReadKey();
        }

        static async void CallMethod(ref bool end)
        {
            Example_01 ex1 = new Example_01();
            await ex1.DoSomeVeryImportantWorkAsync(1, 2500);
            Console.WriteLine("Async Metoda skončila...");
            await ex1.DoSomeOtherVeryImportantWorkAsync(2, 3000);
            Console.WriteLine("Async Metoda 2 skoncila...");
            end = true;
        }
Nahoru Odpovědět
8.12.2015 19:21
Kdo to říká ten to je...
Avatar
Gramli
Tvůrce
Avatar
Gramli:8.12.2015 19:26

Nebo:

static void Main(string[] args)
{
        Task.Run(async () =>
                {
                    CallMethod();
                }).Wait();
    Console.WriteLine("Dokončeno...");
    Console.ReadKey();
}
Nahoru Odpovědět
8.12.2015 19:26
Kdo to říká ten to je...
Avatar
Gramli
Tvůrce
Avatar
Nahoru Odpovědět
8.12.2015 19:27
Kdo to říká ten to je...
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na beats.omni
Petr Čech:8.12.2015 20:16

Můžu se zeptat, co je smyslem? Protože async/await je vlastně jen syntaktický cukr, který slouží přesně k tomu, aby se jednou spustila nějaká akce asychronně, na zbytek jsou tady totiž tasky.

tady je příklad toho, jak je to správně: http://stackoverflow.com/…-to-complete

Editováno 8.12.2015 20:17
Nahoru Odpovědět
8.12.2015 20:16
the cake is a lie
Avatar
beats.omni
Člen
Avatar
Odpovídá na Petr Čech
beats.omni:9.12.2015 12:44

V podstatě to žádný hlubší smysl nemá. Jen se snažím přijít na to, jak to funguje a jak nejlépe to použít. Vyřešil jsem to takhle, nevím, jestli je to nejlepší řešení, ale funguje:

class Example_01
    {
        public async Task DoSomeVeryImportantWork(int id, int sleepTime)
        {
            await Task.Run(() =>
            {
                Console.WriteLine($"Task {id} is beginning...");
                Thread.Sleep(sleepTime);
                Console.WriteLine($"Task {id} is completed.");
            });
        }

        public async Task DoSomeOtherVeryImportantWork(int id, int sleepTime)
        {
            await Task.Run(() =>
            {
                Console.WriteLine($"Task {id} is beginning more work...");
                Thread.Sleep(sleepTime);
                Console.WriteLine($"Task {id} is completed more work.");
            });
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Task.WaitAll(CallMethod());

            Console.WriteLine("Dokončeno...");
            Console.ReadKey();
        }

        static async Task CallMethod()
        {
            Example_01 ex1 = new Example_01();
            await ex1.DoSomeVeryImportantWork(1, 2500);
            Console.WriteLine("Async Metoda skončila...");
            await ex1.DoSomeOtherVeryImportantWork(2, 3000);
            Console.WriteLine("Async Metoda 2 skoncila...");
        }
    }
 
Nahoru Odpovědět
9.12.2015 12:44
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na beats.omni
Petr Čech:9.12.2015 15:23

Podívej se sem: https://youtu.be/DqjIQiZ_ql4

Je tam krásně vysvětleno, jak to přesně funguje.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.12.2015 15:23
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.