2017-10-10 65 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#中的cancellationTokens的概念。我知道上面的代碼不會打印「來自任務的Hello」,因爲在任務運行之前檢查了令牌。瞭解C中的取消標記#

但是我有幾個問題。

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

是什麼上面的語句是什麼意思?在某種意義上,它與簡單地叫Console.WriteLine("Hello from Task")有什麼不同?只是通過傳遞令牌我們能夠取消TaskTask.Run開頭的空括號()是什麼意思?

  1. 如何更改上述代碼以便我可以及時停止特定實例的執行。
+1

「是否只是我們可以通過傳遞令牌來取消任務」 - 否,任務中的代碼必須在運行時檢查取消令牌並在請求取消時退出。任務不會因爲有取消請求而被神奇地停止。 – Enigmativity

+0

儘管它們具有相同的標題,但它與標記爲重複的問題並不完全相同。被問及的問題和具體問題的內容是不同的。 –

回答

-1

首先,空括號是不帶參數的lambda表達式的語法。

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

創建一個函數,然後傳遞給要運行的任務。

當您管理多個併發任務(通常是跨線程)時,取消值將顯示在屏幕上。可靠的跨線程同步和取消需要一些工作和對多線程編程的理解,並使用取消令牌大大簡化了它,並消除了許多常見的初學者陷阱。

當您在後臺啓動了一個較長時間的運行進程,然後希望在完成之前取消它時,將使用該令牌。

+0

是不是'()'表示沒有參數,因爲函數中沒有參數?在示例中它確實將'string'作爲參數。 – liv2hak

+0

@ liv2hak - '()'表示**中沒有傳入參數**。對'Console.WriteLine'的調用有一個參數,但它沒有被**傳遞給**。 – Enigmativity

+0

@Samuel Neff - 我如何修改lambda以傳遞字符串? – liv2hak