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()
這只是一種方式突然關閉線程,並回滾它做了什麼?
基本上task.Wait(超時)不關心任務是否完成或超時後過期。您應該使用取消標記來檢查其IsCancellationRequested屬性並調用ThrowIfCancellationRequested取消任務 –