Пример #1
0
 private async static Task HeavyWorkWithProgressAsync(
     long start, long n,
     CancellationToken token,
     IProgress <byte> progress)
 {
     try
     {
         byte interval = 1;
         for (long i = start; i <= start + n; i++)
         {
             token.ThrowIfCancellationRequested();
             if ((i - start) % (n * interval / 100) == 0)
             {
                 //進捗を報告する
                 progress.Report((byte)((i - start) * 100 / n));
             }
             WriteLine("{0} = {1}",
                       i,
                       await SampleMethods.GetFactorsAsync(i, token));
         }
     }
     catch (OperationCanceledException ex)
     {
         Console.WriteLine(ex.Message);
     }
 }
Пример #2
0
        static void Main(string[] args)
        {
            //HeavyWork1()は何らかの時間のかかる処理
            Task task = new Task(() => { SampleMethods.HeavyWork1(); });

            //非同期処理を開始
            task.Start();

            Console.WriteLine("タスクは別のスレッドで実行されています。");
            task.Wait();
            Console.WriteLine("完了しました。");
        }
Пример #3
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);
        }
Пример #4
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);
        }
Пример #5
0
        static void Main(string[] args)
        {
            int n    = 7000;
            var task = Task.Run <IEnumerable <int> >(() =>
                                                     Enumerable.Range(1, n)
                                                     .Select(m =>
                                                             Enumerable.Range(1, m)
                                                             .Count(k => SampleMethods.GCD(k, m) == 1)));
            var task2 = task.ContinueWith((task1) =>
                                          Task <int> .Run(() =>
                                                          Math.Sqrt(3d * n * n / (double)task1.Result.Sum())));
            var unwraped_task2 = task2.Unwrap();

            unwraped_task2.Wait();
            //task2はTask<Task<double>>型であり待機してもdoubleにならない
            Console.WriteLine("task2の結果:{0}", task2.Result);
            Console.WriteLine("Unwrapしたtask2の結果:{0}"
                              , unwraped_task2.Result);
        }
Пример #6
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)の間の可能性もある。
        }
Пример #8
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("...");
                }
            }
        }
Пример #10
0
        static void Main(string[] args)
        {
            Console.WriteLine("タスクステータスサンプル");
            Task <string> task = new Task <string>(
                () => SampleMethods.GetFactors(2432902008176640008L));

            //ステータスを表示
            Console.WriteLine("A:{0}", task.Status);
            task.Start();
            Console.WriteLine("B:{0}", task.Status);
            while (!task.IsCompleted)
            {
                Task.Delay(1000).Wait();
                Console.WriteLine("C:{0}", task.Status);
            }
            Console.WriteLine("D:{0}", task.Status);
            //正常終了した場合の結果表示
            if (task.Status == TaskStatus.RanToCompletion)
            {
                Console.WriteLine("taskの結果:{0}", task.Result);
            }
        }