2017-10-10 7 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace CancellationTokenExperiments 
{ 
    class CancellationTokenTest 
    { 
     static void Main(string[] args) 
     { 
      CancellationTokenSource tokenSource = new CancellationTokenSource(); 
      CancellationToken token = tokenSource.Token; 
      tokenSource.Cancel(); 
      Task.Run(() => Console.WriteLine("Hello from Task"), token); 

     } 
    } 
} 

C#のcancelationTokensの概念を理解しようとしています。上記のコードは、タスクが実行される前にトークンがチェックされているため、「Hello from Task」は表示されません。C#でのキャンセルトークンの理解

しかし、私はいくつかの質問があります。

  1. Task.Run(() => Console.WriteLine("Hello from Task"), token);

上記の文は何を意味するのでしょうか?どのように単純にConsole.WriteLine("Hello from Task")と呼ぶかとは違う意味で?トークンを渡してTaskを取り消すことができますか?空の中括弧()は、最初にTask.Runの冒頭にあるのは何ですか?

  1. 特定のインスタンスで実行を停止できるように、上記のコードを変更するにはどうすればよいですか。
+1

"トークンを渡すことでタスクを取り消すことができますか?" - いいえ、タスク内のコードは、実行中に取り消しトークンを検査し、取り消しが要求された場合は終了する必要があります。タスクは、キャンセル要求があるために魔法のように停止されません。 – Enigmativity

+0

これは、同じタイトルを持っていても、重複としてマークされたものと実際には同じ質問ではありません。質問の内容と質問される特定の質問は異なります。 –

答えて

-1

まず、空の中カッコは、パラメータのないラムダ式の構文です。

() => Console.WriteLine("Hello from Task") 

実行するタスクに渡される関数を作成します。

キャンセルの価値は、複数の並行タスク(通常はスレッド間)を管理している場合に発生します。信頼性の高いスレッド間の同期とキャンセルには、マルチスレッドプログラミングの作業と理解が必要であり、キャンセルトークンを使用すると、大幅に単純化され、多くの初心者の落とし穴が排除されます。

トークンは、バックグラウンドでより長い実行プロセスを開始し、完了する前にキャンセルしたい場合に使用されます。

+0

'()'は、関数にパラメータがないのと同じパラメータを意味しませんか?この例では 'string'をパラメータとして取ります。 – liv2hak

+0

@ liv2hak - '()'は**に渡されたパラメータ**がないことを意味します。 'Console.WriteLine'の呼び出しにはパラメータがありますが、**で**渡されませんでした。 – Enigmativity

+0

@Samuel Neff - 文字列に渡すラムダを変更するにはどうすればよいですか? – liv2hak