关于C#线程任务的澄清

时间:2017-10-29 12:21:56

标签: c# multithreading task

我正在使用Microsoft here的C#线程任务说明。

他们最后说:

  

Result属性会阻止调用线程,直到任务完成。

我是否正确地认为这只是为一个函数创建一个线程,但仍然保持主线程,以及调用函数的进展,就好像它是通过标准函数调用运行一样?

作为第二个问题,继续我可能不正确的第一个假设,如果我将示例中的代码修改为:

using System;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // Return a value type with a lambda expression
        Task<int> task1 = Task<int>.Factory.StartNew(() => 1);            

        // Return a named reference type with a multi-line statement lambda.
        Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
        {
            string s = ".NET";
            double d = 4.0;
            return new Test { Name = s, Number = d };
        });

        int i = task1.Result;
        Test test = task2.Result;    
    }
}

它会同时创建和运行两个线程,在返回任务之前运行这些函数吗?或者它会像我原先假设的那样一次通过线程?

1 个答案:

答案 0 :(得分:2)

你是对的,微软的例子基本上会同步调用这些函数:

...
Task<int> task1 = Task<int>.Factory.StartNew(() => 1);
int i = task1.Result;

Task<Test> task2 = Task<Test>.Factory.StartNew(() =>
{
    string s = ".NET";
    double d = 4.0;
    return new Test { Name = s, Number = d };
});
Test test = task2.Result;
...

task1将在新线程中启动,然后当前线程将阻塞,直到返回其结果。然后task2将以一个新线程开始...

对于您的示例,他们将同时运行。产生task1,然后task2,然后主线程等待task1的结果,然后等待task2的结果。