2

こんにちは、タスクを理解するための実験を行っています。ここで私がつまずいたもの:

static void Main(string[] args)
    {
        Console.WriteLine(String.Format("Master in the thread {0}", Thread.CurrentThread.ManagedThreadId));

        Task t1 = Task.Factory.StartNew(TaskDoNothing);
        Console.WriteLine(String.Format("Result before wait"));
        Task.WaitAll(t1);            
        Console.WriteLine(String.Format("Result after wait"));

        Console.ReadLine();
    }

    static void TaskDoNothing()
    {
        Console.WriteLine(String.Format("Task in the thread {0}", Thread.CurrentThread.ManagedThreadId));
        Thread.Sleep(3000);            
    }

これは私が期待したように動作します。「待機前の結果がすぐに表示され、タスクが完了すると、「待機後の結果」が表示されます。しかし、使用するTask<TResult>ように変更すると、実行の優先度が変更されたようです。

static void Main(string[] args)
    {
        Console.WriteLine(String.Format("Master in the thread {0}", Thread.CurrentThread.ManagedThreadId));

        Task<int> t1 = Task<int>.Factory.StartNew(TaskDoNothing);
        Console.WriteLine(String.Format("Result before wait: {0}", t1.Result));
        Task.WaitAll(t1);            
        Console.WriteLine(String.Format("Result after wait: {0}", t1.Result));

        Console.ReadLine();
    }

    static int TaskDoNothing()
    {
        Console.WriteLine(String.Format("3- Task in the thread {0}", Thread.CurrentThread.ManagedThreadId));
        Thread.Sleep(3000);
        return 3;
    }

「待機前の結果は、「待機後の結果」とともにタスクが完了したときにのみ表示されます。ManagedThreadId が別のスレッドにあることを示していても、メインスレッドが再開する前にタスク全体が実行されているように見えます。

誰かがそれを手伝ってくれますか?前もって感謝します!

4

2 に答える 2

3

Task.Resultブロック操作です。実際、タスクが完了するのを待ちます。結果が必要だが待機しない場合は、次を使用できますContinueWith

于 2013-05-10T18:44:45.627 に答える
0

私自身の経験からTask.Result、操作の結果が出るまで待ちます。

于 2013-05-10T18:46:01.850 に答える