1

だから私が理解していないのは、次のアプリケーションで何が起こるかです:

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()、スレッドを突然閉じて、それが行ったことをロールバックする方法にすぎませんか?

4

1 に答える 1

3

あなたの問題はキャンセルとは何の関係もないと思います。または、最初のWait()ことを忘れただけです。Start()Task

于 2012-12-16T16:25:14.563 に答える