在C#</tresult>中使用Task和Task <tresult>之间的区别是什么

时间:2013-05-10 18:41:43

标签: .net multithreading task

您好我正在做一些实验来理解任务。这是我偶然发现的:

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告诉它们在单独的线程上。

有人可以帮我吗? 提前谢谢!

2 个答案:

答案 0 :(得分:3)

Task.Result是阻止操作。实际上,您等待任务完成。如果您想要结果而不是等待,那么您可以使用ContinueWith

答案 1 :(得分:0)

根据我自己的经验,Task.Result会一直等到操作结果。