Task类的实例(Task.Factory.StartNew或TaskCompletionSource)

时间:2011-04-15 09:35:36

标签: c# multithreading task-parallel-library

这可能是一个非常基本的问题,但我只想确保自己能够做到这一点。 今天我正在挖掘TPL库,发现有两种方法可以创建Task类的实例。

我的方式

 Task<int> t1 = Task.Factory.StartNew(() =>
                {
                    //Some code
                    return 100;

                });

方式II

  TaskCompletionSource<int> task = new TaskCompletionSource<int>();
  Task t2 = task.Task;
  task.SetResult(100);

现在,我只是想知道

  1. 这些实例之间有什么区别吗?
  2. 如果是,那又是什么?

2 个答案:

答案 0 :(得分:4)

第二个例子没有创建一个“真正的”任务,即没有代理做任何事情。

您主要使用它来向调用者提供Task接口。看看上面的例子 msdn

    TaskCompletionSource<int> tcs1 = new TaskCompletionSource<int>();
    Task<int> t1 = tcs1.Task;

    // Start a background task that will complete tcs1.Task
    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
        tcs1.SetResult(15);
    });

    // The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
    // It should be a wait of ~1000 ms.
    Stopwatch sw = Stopwatch.StartNew();
    int result = t1.Result;
    sw.Stop();

    Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result);

答案 1 :(得分:1)

由于您没有在上面的 Way 1 中触发任何异步操作,您通过从线程池中消耗另一个线程来浪费时间(可能,如果您不更改默认TaskScheduler )。

然而,在Way 2中,您正在生成一个已完成的任务,并且您在与您相同的线程中执行该任务。 TCS也可以被视为无线程任务(可能是错误的描述,但是被几个开发人员使用)。