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); } }
static void Main(string[] args) { //HeavyWork1()は何らかの時間のかかる処理 Task task = new Task(() => { SampleMethods.HeavyWork1(); }); //非同期処理を開始 task.Start(); Console.WriteLine("タスクは別のスレッドで実行されています。"); task.Wait(); Console.WriteLine("完了しました。"); }
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); }
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); }
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); }
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)の間の可能性もある。 }
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("..."); } } }
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); } }