非同期および非同期メソッドをキャンセルターものの一部(タスク)は、非同期および非同期メソッドをキャンセルTER事の(タスク)チャットをマルチスレッド化することをマルチスレッドの話

   こんにちは、どのように彼らは、前二条の導入により、あなたを満たすためには、同期をブロックし、実行中のタスクの作成は、このように、運転を継続し、とても良い理解との使用、実際のシーン記述を持っていますこのようなシナリオ、オープンtsak非同期タスクは、トリガ条件がある場合は、ニーズを実際の作業では、マルチスレッドでのビジネスの大部分を解決することができますが、それだけのいくつかは十分ではありません、例えば、として、実行終了tsakは、どのようにそれを達成する必要がありますか?これがまさに問題のいくつかは、我々は今日、これらの問題のいくつかと、私たちは一緒に、今日の話題に為替の共有部分に必要なものです、ありがとう!

    あなたは前の二つの記事を読んでいない場合は話題に入る前に、ので、今日の内容の理解がより一貫性の把握であることを、読んするには、以下のアドレスをクリックしてあなたに感謝してください!

  まず:一つのこと(タスク)の一部が閉塞して実行する複数のスレッドを作成するかについての話

  第二:運転の継続をビスものの(タスク)マルチスレッドの話

  パートIII:話マルチスレッドについての事の(タスク)非同期および非同期メソッドをキャンセルterを

 

キャンセルミッションのタスク:CancellationTokenSource

 

    スレッドのキャンセルについて、私たちは実際にこの問題が発生しますと信じて、道非同期スレッドに関係なくは、スレッド操作をキャンセルするための適切なメカニズムを持っています。また、これは例によって同時に、スレッドのスレッドのTsakのマテリアライゼーション解除スレッドを電子化します。

    私の経験では、多くの場合、非同期スレッド操作に業務の定期的なサイクル数は、非同期ジョブプログラムの数を、実際の使用シナリオをキャンセルする必要があります。このような定期的なデータ同期、データ更新操作など。例:一般的なシナリオの電力供給システム、注文は残業などキャンセル。

    前の2つの例との整合性を維持するために、私は、一例として、現在またはホテルのビジネスデータ同期プラットフォームで午前:

    需要:朝の3時3週間、Ctripのホテルページ問合せインタフェース、最新のホテル一度同期データの全体量で提供。そして、データの同期は、人間の介入操作によって終了することができます。

    今、私は2つの方法でスレッドやタスクによって達成されます

    まず、キャンセルタスクスレッドの時代

    母は、数年前にプロジェクトを言って本当のことを言う、私はまた、非同期スレッドをスレッドに使用される、スレッドは、ビジネスシナリオのキャンセルが発生します。私は、実装は、タスクをキャンセルすることが要求されて、あなただけの最初の何isStopThread、唯一の非終了を決定し、isStopThread値、具体的な事業の各実行を制御する必要があるグローバル変数、isStopThread時間を(スレッドを終了するかどうか)を定義することですでした特定のビジネス・ロジックの実装前の状態。

/// <要約> 
 ///ホテルCtripのデータ同期(スレッド)
 /// </要約> 
 プライベートの静的な無効CtripHoteDataSynchrByThread()
 { 
     CancellationTokenSource CancellationTokenSource =新しい新; CancellationTokenSource()
     スレッドステップを通じて//オープンスレッド
     スレッド=新しい新しいスレッドスレッド(()=> 
     { 
         //は数のデータを取得する
         int型getDataIndex = 1 ;  isStopCtripHoteDataSynchrは=偽; 
 // Ctripのページングサービスを呼び出すことによって、ホテルには有効なデータを取得する データを取得する前に//、最初に何を決定しますかどうか、取得を終了する
 (!ながら、すべてのホテルは、有効なデータがcancellationTokenSource.IsCancellationRequested){//今仮定するシミュレーション、取得Ctripのは、完全なConsole.WriteLineをを取得します($ 3つのパスは「Ctripのは、最初のページ{getDataIndex}のホテルのデータを取得するために始めました... 。\ n "は);のThread.sleep(3000 ); Console.WriteLineを($「Ctripの最初のページ{getDataIndex}ホテルデータ取得が\ N-を完了している」); getDataIndex ++ ; //データ取得のアナログ完成3ページ、データ収集を直接終了のうちに代わって完成されましたIF(getDataIndex == 4。){Console.WriteLineを($ "同期データのホテルCtripの\ N-" ); BREAK ;}} IF (isStopCtripHoteDataSynchr){Console.WriteLineを($ "ホテルCtripのキャンセル同期データ\ N-" ;}}); thread.Start() ; Console.WriteLineを( " データ同期Ctripのホテル..... \ N-" ); //同期でシミュレート実際のデータは、データをキャンセルする」(Console.WriteLineををキャンセルその後、同期、動作\ nはキャンセルする任意の文字を入力してください" ); Console.ReadLine(); cancellationTokenSource.Cancel(); isStopCtripHoteDataSynchr = trueに; Console.WriteLineを($" Ctripのが同期ホテルのデータをキャンセル立ち上げた\ n「はリクエスト)。 }
 

結果:

    我々は最初の二つのデータを得る上で、テスト結果を見ることができ、その後、キャンセルスレッドコマンドを開始しました。データ収集の2ページ目が終了すると、スレッドはスレッドの取り消しの目的を達成するように、内側に終了します。

    第二に、タスクがキャンセルミッションの時代

    タスクの発表により、Microsoftはまた、我々はスレッドをキャンセルすることができます良いヘルプの種類によって、クラス(CancellationTokenSource)の助けを借りスレッド取り消しに特別なサービスを開始し、我々は最初のCancellationTokenSourceクラスによって、上記の例を実現、あまり話をしませんでした機能。

/// <まとめ> 
 /// Ctripのホテル同期データ(タスク)
 /// </要約> 
 プライベート静的ボイドCtripHoteDataSynchrByTask()
 { 
     //タスクのキャンセル機構定義
     CancellationTokenSource CancellationTokenSource =新しい新しいCancellationTokenSourceを(); 

     //ステップスレッドでスレッドを開く
     タスクのスレッド=新しい新しいタスク(()=> 
     { 
         数//取得したデータを
         int型getDataIndex = 1 ; 
 // Ctripのページングサービスを呼び出しては、ホテルには有効なデータ取得 まず、データを取得する前に//を取得終了かを判断
 しながら(!cancellationTokenSource.IsCancellationRequestedが) {  すべてのホテルは、有効なデータ//ここで仮定するシミュレーション、Ctripのは3回で完成されます取得 Console.WriteLineを( "Ctripのが\ N- ....最初のページ{getDataIndex}のホテルのデータを取得するために始めた" $ ); Console.WriteLineを($ "Ctripの最初のページ{getDataIndex}ホテルデータ取得が\ N-を完了している" ); getDataIndex ++ ; //第3ページのアナログデータを取得した後、代表的なデータ収集が完了すると、IF(getDataIndex == 4。から直接終了){Console.WriteLineを($ "同期データホテルCtripの\ N-" ); BREAK ;}} IF (CancellationTokenSource。 IsCancellationRequested){Console.WriteLineを($ "ホテルCtripのキャンセル同期データ\ N-" );}}); Thread.Start(); Console.WriteLineを( "データ同期Ctripのホテル..... \ N-" ); / /実際のデータ同期のシミュレーションは、Console.WriteLineをする(「あなたはデータの同期をキャンセルする必要がある場合は、\動作するように任意の文字を入力するn個キャンセル」キャンセル); Console.ReadLine(); //スレッドを直接キャンセルcancellationTokenSource.Cancelを() ; //指定した時間後にスレッドをキャンセルcancellationTokenSource.CancelAfter //(1000); Console.WriteLineを($ "Ctripのが同期ホテルデータ\ n個の要求をキャンセル立ち上げました" );}
 

テスト結果:

 

    テストの結果、全く同じの2つの実装の結果

    もちろん、CancellationTokenSourceも長いスレッド後にキャンセル達成するためにCancelAfter(どのくらい後のキャンセル)方法を提供します。

    あなたは、その実装は、タスクとスレッドを行うには何も少なからずありません、問題のCancellationTokenSourceを発見した場合はわからないが、そういえば、最初のインスタンスでキャンセルすることによって実現スレッドスレッド、同じことが実現するためにCancellationTokenSourceを組み合わせることができます。だから、私はCancellationTokenSourceはスレッドがこのような理由でキャンセルされ、マイクロソフトに提供されるヘルプをクラスの冒頭で述べました。実際に、私はCancellationTokenSourceのリアライズソースを開くことができ、実際には、我々は明らかであろう、コアロジックは、スレッドをキャンセルし、私たちの上にスレッドのキャンセル原則は非常に似ていると言う、変数の値を達成するように制御されているが、そのすべての業務のCancellationTokenSource行動パッケージ。どの定義、タイマーや最終的にはCanelと同じを開くことですCancelAfter。します。https://www.cnblogs.com/majiang/p/7920102.htmlあなたはCancellationTokenSourceのソースコードを見たい場合は、以下のアドレスを表示することができます

最後に、タスクとCancellationTokenSourceは、.NET Framework4.0 +であることに留意されたい。NETコア、.NETの標準。

 

非同期メソッド(非同期/のawait)

 

    C#5.0、Microsoftは非同期メソッドのキーワードは非同期である新機能が導入されました。我々は、単にはるかに魅力的、あなたが見つけると、同期方法は非常に似て実装するだろう非同期メソッドを達成したい非同期(async)と、それだけでは非同期方式に変更する必要があります。もちろん、シンプルな内装呼び出した場合、コールは、同期になり、本当を達成するために、非同期呼び出しは、多くの場合で使用する別のキーワードを待つ必要があります。

    簡単に言えば、非同期機能非同期(async)について説明します。

    非同期三種類を返します。

    Tsak:メインシナリオでは、唯一の非同期メソッドの実行状態に関係メインプログラムを適用し、メインスレッドは、データ交換の結果のいずれかを有する必要はありません。

    タスク<T>:メインシナリオは、適用できないだけで主な関心事非同期メソッド実行状態であり、また結果Tのデータ型を実行した後に返すようにしたいです

    無効:メインプログラムでもない関係非同期メソッドの実行状態は、その実行の結果を気にしないが、呼び出し元ではないので、メインプログラムは、イベントハンドラのコードに加えて、通常のボイド方法非同期の使用を奨励していない、非同期メソッドを呼び出します

    導入でキーワード待ちます。

    awaitその名前が意味を待っている提案し、その動作原理は次のとおりです。呼び出し側の実行は待つためにすぐに戻りますが、非同期非同期メソッドの実行結果を待ちます。だから、のawaitのみ非同期メソッド本体を変更し、非同期に存在し、ちょうどあなたが真の非同期を達成することができますのでことを、現在の非同期メソッドがダウンし続けてブロックし、メインスレッドをブロックしないで待っています。

各ケースの使用を説明する簡単な例以下:

メインボイド静的(文字列[]引数)
 { 
     Console.WriteLineを( "メインスレッド開始\ N-" ); 
     Console.WriteLineを( "メインスレッド同期メソッド呼び出し:SynTest \ N-" ); 
     SynTest(); 

     Console.WriteLineを(「主非同期メソッド呼び出しをスレッド:AsyncTestNoAwait \ N- " );  AsyncTestNoAwait(); 
 Console.WriteLineを("メインスレッドの非同期メソッド呼び出し:AsyncTestHasAwait \ N- " );  AsyncTestHasAwait(); 
 Console.WriteLineを("「\ N-を終了し、メインスレッド);コンソール.ReadKey();} /// <要約 > /// 同期試験方法/// </要約>パブリック静的ボイドSynTest(){Console.WriteLineを( "同期方法SynTest実行\ N-" );のThread.sleep (5000 ); Console.WriteLineを( "最後の同期方法のSynTest実行\ n"は);} /// <要約> ///非同期試験方法(のawaitキーワードなし)/// </要約>パブリック静的ボイド非同期AsyncTestNoAwait(){Console.WriteLineを(「非同期メソッドAsyncTestNoAwaitは\ Nを実行します" );のThread.sleep(5000 ); Console.WriteLineを("端実行非同期メソッドAsyncTestNoAwait \ N-」);のawaitキーワードを有する} /// <まとめ> ///非同期試験方法()/// </まとめ>パブリック静的ボイド非同期AsyncTestHasAwait(){Console.WriteLineを( "非同期メソッドAsyncTestHasAwaitが\ N-実行" );のawait Task.Delay(5000 );( "端実行非同期メソッドAsyncTestHasAwait \ N-" Console.WriteLineを);}

結果:

結果から、我々は良いドローを実行できます。

    図1に示すように、非同期メソッド非同期キーワード、その実装の原則や同期呼び出しを待っていない場合

    2、キーワード非同期のawait雲は、修正された方法の本体存在することができます

    図3に示すように、非同期メソッド呼び出し非同期でのみ遭遇するブロックがのawaitキーワードの後に​​非同期に実行され、その予備のawaitキーワードまたは同期コードブロックの実行

    まあ、管理非同期が最初にここで紹介し、ために時間と記事のスペース上の理由で、具体的に、あなたは本当の非同期でのフォローアップを行うために必要なものがたくさんもありません/特集を待っています。

要約:

    到目前为止,有关Task的3篇文章都到此结束,下面在回顾总结一下Task的相关功能点吧!

    1、Task的创建运行可以有三种方式:new Task/Task.Factory/Task.Run

    2、Task的返回参数定义Task<返回类型>

        获取返回值:Task.Result->要阻塞主流程

    3、Task线程的同步实现不仅仅可以通过RunSynchronously来实现同步运行,当然还可以通过Task.Result/Task.Wait等方式来变向实现

    4、Task的wait/waitAll/waitAny实现阻塞等待执行结果

    5、Task的WhenAny、WhenAll、ContinueWith实现延续操作

    6、CancellationTokenSource实现异步任务取消

    7、异步方法之:(async/await)实现同步和异步调用等

 

猜您喜欢: 

 第一篇:聊聊多线程哪一些事儿(task)之 一创建运行与阻塞

 第二篇:聊聊多线程哪一些事儿(task)之 二 延续操作

END
为了更高的交流,欢迎大家关注我的公众号,扫描下面二维码即可关注,谢谢:

おすすめ

転載: www.cnblogs.com/xiaoXuZhi/p/XYH_tsak_WhenAny1.html