在C#5中,异步函数和非异步函数之间的区别是什么?

时间:2014-08-13 08:59:16

标签: c# multithreading asynchronous parallel-processing

假设我有以下代码:

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();

不要阻止主线程。

这两个函数之间有什么区别吗?

2 个答案:

答案 0 :(得分:0)

区别在于您使用它的方式。 在第一个(CaculateSometingAsync)中,您将其声明为异步,然后等待其内部直到完成。然后你返回它返回的任何东西。

在你的第二个(CaculateSometingAsync1)中,你只是把它当作一种“发射而忘记”的东西,所以它就会消失,等待,然后直接返回到你召唤它的地方。

(为什么你使用方法println来打印字符串?:))

答案 1 :(得分:0)

你等待CaculateSometingAsync内部,但可以等待s,因为该方法被声明为异步,因为你无法在s1上等待,因为CaculateSometingAsync1未被声明为异步。您使用关键字的方式意味着bahviour没有区别