连续的ContinueWith语句

时间:2015-07-15 01:35:10

标签: c# asynchronous task

我有

    System.Threading.Tasks.Task.Factory.StartNew (() => {
       doSomething();
    }).ContinueWith (t => {
       doSomething2();
    }).ContinueWith (x => {
       doSomething3();
    }, TaskScheduler.FromCurrentSynchronizationContext ());

这些方法是否按连续顺序执行?即,doSomething()已执行,一旦完成,doSomething2()即开始,一旦完成,doSomething3()开始

如果它们没有按连续顺序执行,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

正确。它将始终按顺序执行。 ContinueWith将仅在调用任务完成后运行。

  

创建在目标任务完成时异步执行并继续返回值的延续。

msdn reference

答案 1 :(得分:0)

有了这些问题,一个简单的方法就是写一个快速测试:

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


public class Program
{
    public static void Main()
    {
        Console.WriteLine("{0}: Starting Main: Thread ID {1}", DateTime.Now.TimeOfDay, Thread.CurrentThread.ManagedThreadId);
        var finalTask = Task.Delay(500)
            .ContinueWith(_ => {
                Console.WriteLine("{0}: First Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            })
            .ContinueWith(_ => {
                Console.WriteLine("{0}: Second Continue With: Task ID {1}, Thread ID {2}", DateTime.Now.TimeOfDay, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            });;

        finalTask.Wait();
        Console.WriteLine("{0}: Finished!", DateTime.Now.TimeOfDay);
    }
}

这产生以下结果。通过查看时间,这可以确认第二个ContinueWith仅在第一个02:03:16.1360139: Starting Main: Thread ID 107 02:03:16.6407471: First Continue With: Task ID 1, Thread ID 272 02:03:17.6514780: Second Continue With: Task ID 2, Thread ID 272 02:03:18.6592219: Finished! 完成后才会发生。

command.Parameters.AddWithValue("@parameter",yourValue);
command.ExecuteNonQuery();

.NET Fiddle