假设我有以下代码:
static void Main(string[] args)
{
println("begin s");
Task<int> s = CaculateSometingAsync();
println("begin s1");
Task<int> s1 = CaculateSometingAsync1();
println(s.Result.ToString());
println(s1.Result.ToString());
}
static async Task<int> CaculateSometingAsync()
{
return await Task.Factory.StartNew<int>(() =>
{
Thread.Sleep(1000);
return 100;
});
}
static Task<int> CaculateSometingAsync1()
{
return Task.Factory.StartNew<int>(() =>
{
Thread.Sleep(1000);
return 200;
});
}
结果如下:
16:55:38 begin s
16:55:38 begin s1
16:55:39 100
16:55:39 200
我对这两个功能的了解是它们具有相同的行为。 他们都创建了一个线程池线程来运行任务。
两个
Task<int> s = CaculateSometingAsync();
和
Task<int> s1 = CaculateSometingAsync1();
不要阻止主线程。
这两个函数之间有什么区别吗?
答案 0 :(得分:0)
区别在于您使用它的方式。
在第一个(CaculateSometingAsync
)中,您将其声明为异步,然后等待其内部直到完成。然后你返回它返回的任何东西。
在你的第二个(CaculateSometingAsync1
)中,你只是把它当作一种“发射而忘记”的东西,所以它就会消失,等待,然后直接返回到你召唤它的地方。
(为什么你使用方法println
来打印字符串?:))
答案 1 :(得分:0)
你等待CaculateSometingAsync内部,但可以等待s,因为该方法被声明为异步,因为你无法在s1上等待,因为CaculateSometingAsync1未被声明为异步。您使用关键字的方式意味着bahviour没有区别