Пример #1
0
        static void Main(string[] args)
        {
            Console.WriteLine("計算開始");
            Task <double> task = Task.Run <double>(
                () => SampleMethods.HeavyWork2(10000000));

            //非同期メソッドの中では
            //double result = await task;
            //として、その後に後続処理を書ける
            task.Wait();
            double result = task.Result;

            Console.WriteLine("計算結果:{0}", result);
        }
Пример #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Task.WaitAllサンプル開始");
            Task <double> task1 = Task.Run <double>(
                () => SampleMethods.HeavyWork2(10000000));
            Task <double> task2 = Task.Run <double>(
                () => SampleMethods.HeavyWork2(5000000));

            //現在のスレッドをブロックして待つ
            Task.WaitAll(task1, task2);
            //非同期メソッドの中では、awaitを使用してブロックせずに待つ
            //await Task.WhenAll(task1, task2);
            Console.WriteLine("すべてのタスクが終了しました。");
            Console.WriteLine("task1の結果{0}", task1.Result);
            Console.WriteLine("task2の結果{0}", task2.Result);
        }
Пример #3
0
        static void Main(string[] args)
        {
            Console.WriteLine("タスクを実行します。");
            //コンストラクタとStartメソッドを一度に呼び出す場合
            //RunまたはFactory.StartNew
            Task <double> task =
                Task.Run <double>(
                    () => SampleMethods.HeavyWork2(10000000));
            //TaskCreationOptionsやTaskSchedulerを指定する場合は
            //Task.Factory.StartNewを使用する
            Task <double> task2 =
                Task.Factory.StartNew <double>(
                    () => SampleMethods.HeavyWork2(15000000));

            //タスクが未完了の場合はResultプロパティは
            //メインスレッドをブロックする
            Console.WriteLine("task計算結果:{0}", task.Result);
            Console.WriteLine("task2計算結果:{0}", task2.Result);
        }
        static void Main(string[] args)
        {
            //親タスク
            var parentTask = new Task(() =>
            {
                //入れ子になったタスク
                var nestedTask = new Task(() =>
                {
                    SampleMethods.HeavyWork2(5000000);
                    Console.WriteLine("入れ子タスク(A)完了");
                }
                                          );
                //子タスク
                nestedTask.Start();
                //TaskCreationOptions.AttachedToParentを指定して
                //子タスクとして作成
                var childTask = new Task(() =>
                {
                    SampleMethods.HeavyWork2(1000000);
                    Console.WriteLine("子タスク(B)完了");
                }, TaskCreationOptions.AttachedToParent
                                         );
                childTask.Start();
            }
                                      //DenyChildAttachを指定すると子タスクの
                                      //AttachedToParentは無効になる
                                      //,TaskCreationOptions.DenyChildAttach
                                      );

            parentTask.Start();
            while (!parentTask.IsCompleted)
            {
                //完了を待つ
            }
            //単なる入れ子タスクの場合、親タスクは入れ子タスクを待たない
            //親子関係がある場合、親タスクは子タスクの完了を待ってから終了する
            Console.WriteLine("親タスク(C)完了");
            //入れ子タスク(A)を3秒は待つ(Aは3秒以内に完了するとは限らない)
            Task.Delay(3000).Wait();
            //一般に(A)に関しては、(B)より早く完了する場合も、
            //(B)と(C)の間の可能性もある。
        }
Пример #5
0
        static void Main(string[] args)
        {
            //HeavyWork2()は何らかの時間のかかる処理
            Task <double> task = new Task <double>(() =>
                                                   SampleMethods.HeavyWork2(10000000L));

            //非同期処理を開始
            task.Start();
            Console.WriteLine("タスクは別のスレッドで実行されています。");
            while (!task.IsCompleted)
            {
                //タスクが完了するまでメインでは別の処理を行える
                Task.Delay(500).Wait();
                Console.Write(".");
            }
            //結果をResultプロパティで取得
            double result = task.Result;

            Console.WriteLine("完了しました。");
            Console.WriteLine($"計算結果={result}");
        }
        static void Main(string[] args)
        {
            Task <double> task =
                Task.Run <double>(() => SampleMethods.HeavyWork2(10000000));

            //タスクが完了した後に実行されるタスクを指定する
            task.ContinueWith((antecedent) =>
            {
                Console.WriteLine("taskの実行結果:{0}", antecedent.Result);
            }, TaskScheduler.Default);
            //GUIアプリで、後続タスクで結果表示などでUIにアクセスする場合は
            //TaskScheduler.FromCurrentSynchronizationContext()が必要
            while (!task.IsCompleted)
            {
                Task.Delay(500).Wait();
                if (!task.IsCompleted)
                {
                    Console.WriteLine("...");
                }
            }
        }