我正在使用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;
}
}
它会同时创建和运行两个线程,在返回任务之前运行这些函数吗?或者它会像我原先假设的那样一次通过线程?
答案 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
的结果。