2012-12-16 15 views
1

所以我不明白的是在下面的應用程序會發生什麼:使用Tasks.Wait()回滾事件,並使用取消令牌爲什麼不

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("TaskVersion:"); 
     Task t = new Task(waitCB, "something"); 
     t.Wait(1000); 

     Console.WriteLine("TaskWithCancelationTokenVersion:"); 
     CancellationTokenSource cts = new CancellationTokenSource(); 
     Task tct = new Task(waitCB, "something", cts.Token); 
     tct.Start(); 
     Thread.Sleep(1000); 
     cts.Cancel(); 

     Console.WriteLine("ThreadVersion:"); 
     Thread th = new Thread(waitCB); 
     th.Start("something"); 
     Thread.Sleep(1000); 
     th.Abort(); 
    } 

    static void waitCB(object ob) 
    { 
     Console.WriteLine("Object is " + ob); 
     Thread.Sleep(10000); 
    } 
} 

在第一個例子中,我認爲,程序應執行該行:Console.WriteLine("Object is " + ob);,然後當它中止t.Wait(1000)時,不存在任何行。

的程序的輸出均爲:

TaskVersion: 
TaskWithCancelationTokenVersion: 
Object is something 
ThreadVersion: 
Object is something 

所以task.Wait()這只是一種方式突然關閉線程,並回滾它做了什麼?

+0

基本上task.Wait(超時)不關心任務是否完成或超時後過期。您應該使用取消標記來檢查其IsCancellationRequested屬性並調用ThrowIfCancellationRequested取消任務 –

回答

3

我覺得你的問題與取消無關或Wait(),你只是忘了Start()第一個Task

+0

我剛剛發佈相同的答案。 –

相關問題