非同期マルチスレッド(D)タスク

仕事

コンセプト:

タスクのスレッドプールに基づいて、スレッド豊富な提供APIを

 

タスクの起動モード

最初:

タスクのタスク=新しいタスク(()=> this.DoSomethingLong( "btnTask_Click_1"));

task.Start();

 

第二:

 タスクのタスク= Task.Run(()=> this.DoSomethingLong( "btnTask_Click_2"));

 

第三:

 TaskFactory taskFactory = Task.Factory。

 タスクのタスク= taskFactory.StartNew(()=> this.DoSomethingLong( "btnTask_Click_3"));

 

共通 API

ディレイ

 睡眠同期待ち

 遅延非同期の待ち時間は、満たすために必要ContinueWithを()で使用されます

タスクのタスク= Task.Delay(2000)

    .ContinueWith(T =>

    {

        stopwatch.Stop();

}); // 非同期待機- 待つ2S 新しいジョブを開始した後

 

 

ContinueWhenAny

コールバックノンブロッキング;およびスレッドが新しいスレッドを使用している可能性があり、唯一のメインスレッドではないことができ、タスクを完了するためだけのスレッドかもしれ続きを作成し、タスクを、グループ提供のいずれかのタスクが完了した後に、それはすぐに開始します

構文

TaskFactory taskFactory =新しいTaskFactory();

一覧<タスク>タスクリスト=新しいリスト<タスク>();

taskList.Add(taskFactory.StartNew(()=> this.Coding( "XXX"、 "ポータル")))。

taskFactory.ContinueWhenAny(

taskList.ToArray()、T => Console.WriteLie()

);

 

ContinueWhenAll

コールバックノンブロッキング;およびスレッドが新しいスレッドを使用している可能性があり、唯一のメインスレッドではないことができ、タスクを完了するためだけのスレッドかもしれタスクの継続を作成タスクが完了したタスクの指定されたセットの後に開始します

構文:

TaskFactory taskFactory =新しいTaskFactory();

一覧<タスク>タスクリスト=新しいリスト<タスク>();

taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray()、rArray => Console.WriteLineを()))。

 

WAITANY

現在のスレッドをブロックし、すべてのタスクが完了するのを待っています

Task.WaitAny(taskList.ToArray()); //は、待ち時間を制限することができます

 

WaitAll

私たちは、タスクを完了するために、すべてのスレッドを待ってし続けることができるように必要な  すべてのタスクの完了を待って、現在のスレッドをブロック

Task.WaitAll(taskList.ToArray())。

 

を続行

コールバック、中に目標を作成するタスクが非同期に完了したタスクの実行を継続します

Task.Run(()=> this.DoSomethingLong( "btnTask_Click"))

.ContinueWith(T => Console.WriteLineを()); // 回调

 

 

完全なコード例

          #regionタスクスタート
            { 
                /// /スタートモードタスク
                // ;タスクタスクタスク新しい新=(()=> Console.WriteLineを( "buttonTask_Click"))
                 // task.Start(); 
                /// /起動モードタスク2 
                // タスクTaskRun Task.Run =(()=> Console.WriteLineを( "buttonTask_Click")); 
                /// /起動モードタスク3 
                // TaskFactory TaskFactory新しい新しいTaskFactory =();
                 // タスクTask2の= taskFactory.StartNew (()=> Console.WriteLineを( " buttonTask_Click"));
            }
             #Endregionの

            #region遅延非同期待機は
            { 
                /// /遅延併用ContinueWith待ち()と一般的に非同期である
                 ////スリープ同期待ち
                 /// / ContinueWhenAny:コールバック、非同期に実行タスクの継続完了したタスクに目標を作成
                // ストップウォッチストップウォッチ=新しい新しいストップウォッチ(); 
                /// ブロックしない、/非同期待機を
                // タスクのタスク=タスクを.Delay(2000).ContinueWith(T => 
                 // {
                 //     stopwatch.Stop();
                 //     Console.WriteLineを(+ "実行時間:" "これは遅延である" + stopwatch.Elapsed); 

                // })。
                 // Console.WriteLineを( "これは遅延の後に待機する方法である");                
            }
             #endregion 

            #region ContinueWhenAnyノンブロッキングコールバック
             // {
             //     ////     })。// }

            

            
            #endregion 

            #region ContinueWhenAll、ノンブロッキングコールバック// {
             // // タスクの継続を作成し、それが即座に開始が完了した後、グループ内のすべてのタスクを提供します
             //     )TaskFactory TaskFactory =新しい新しいTaskFactory(;
             //     リスト<タスク>タスクリスト=新しい新しいリスト<タスク>();
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "ジョー・スミス"、 "ContinueWhenAny 01")));
             //     taskList.Add(TaskFactory。 StartNew(()=> this.Coding( " シート4"、 "ContinueWhenAny 02")));
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "5"、 "ContinueWhenAny 03" )));
             //     TaskFactory。
            ContinueWhenAll(taskList.ToArray()、T =>

                //     { 

            //         Console.WriteLineを( "他の方法2");
             //     }); 

            // } 
            #endregion 

            #region遮断WAITANY現在のスレッド、任意完了するタスクを待っ
             // { 

            //     リスト<タスク>タスクリストを一覧表示新しい新しい= <タスク>();
             //     TaskFactory TaskFactory =新しい新しいTaskFactory();
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "ジョー・スミス"、 "WAITANY 01"))
             ); //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "ジョン・ドウ"、 "WAITANY 02")));
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "王5「」
            WAITANY 03" ))); //    taskList.Add(taskFactory.StartNew(()=> this.Coding( " 趙6"、 "WAITANY 04")));
             //     Task.WaitAny(taskList.ToArray());
             //     Console.WriteLineを(「I別法)」である; 

            // } 
            #endregion 

            #region WaitAll現在のスレッドは、すべてのタスクの完了を待ってブロックし
             // { 

            //     リスト<タスク> =タスクリスト新しい新しいリスト<タスク>();
             //     TaskFactory TaskFactory =新しい新しいTaskFactory ();
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding( "ジョー・スミス"、 "WAITANY 01")));
             //     taskList.Add(taskFactory.StartNew(()=>本。 ( "ジョン・ドウ"、 "WAITANY 02"))コーディング
             )。//    taskList.Add(taskFactory.StartNew(()=> this.Coding( " 王呉"、 "WAITANY 03")));
             //     taskList.Add(taskFactory.StartNew(()=> this.Coding(「 趙6 "" WAITANY 04 ")));
             //     Task.WaitAll(taskList.ToArray());
             //     Console.WriteLineを(" I「は別の方法である); 

            // } 
            #endregion 


            #region   ContinueWithで目標を作成タスクが完了したときにタスクが非同期に実行を継続
             // {
             //     Task.Run(()=> {
             //         Console.WriteLineを( "ContinueWith1");
             //         Console.WriteLineを( "ContinueWith11");
             //         コンソール。
            WriteLineメソッド( "ContinueWith111");//     })ContinueWith(T => {
             //         Console.WriteLineを( "ContinueWith2");
             //         Console.WriteLineを( "ContinueWith22");
             //         Console.WriteLineを( "ContinueWith222");
             //     });
             / / } 
            #endregionの

            #regionは、同時タスクの数を制御する拡張
            { 
                // あなたは私が何をどのように、タスクの下で同時の数を制御したいと言う場合は?5
                 // 容器作業準備 
                リスト<タスク> =タスクリスト新しい新しいリスト<タスク> ();
                 // インスタンスTaskFactory 
                TaskFactory TaskFactory = 新しい新TaskFactory(); 
                taskList.Add(taskFactory.StartNew(() => Console.WriteLineを(" 张三" + " " + " WAITANY 01 " )))。
                taskList.Add(taskFactory.StartNew(() => Console.WriteLineを(" 李四" + " " + " WAITANY 02 " )))。
                taskList.Add(taskFactory.StartNew(() => Console.WriteLineを(" 王五" + " "" ))); 
                TaskList.Add(taskFactory.StartNew(() => Console.WriteLineを(" 趙6 " + " " + " WAITANY 04 ))); 

                のためのint型 I = 0 Iの<; 10 ; I ++ 
                { 
                    int型 K = I;
                     // != TaskStatus.RanToCompletion t.Status
                     // 。スレッドの数は、タスクリストが失敗した場合よりも大きい5 
                    IF(!taskList.Count(T => t.Status = TaskStatus.RanToCompletion)> = 5 
                    {
                        Task.WaitAny(taskList.ToArray())。
                        タスクリスト = taskList.Where(トン=> t.Status =!TaskStatus.RanToCompletion).ToList(); 
                    } 
                    taskList.Add(Task.Run(() => 
                    { 
                        Console.WriteLineをは($は、" {実行スレッドID = Thread.CurrentThread.ManagedThreadId.ToString(これは、{K}である" 00 " )} " ); 
                        (のThread.sleep 2000 ); 
                    }))。
                } 
            } 
            #endregion

 

おすすめ

転載: www.cnblogs.com/JohnTang/p/10992420.html