任务WaitAll在c#中无法正常工作

时间:2013-06-07 13:57:32

标签: c# multithreading task wait

我正在使用System.Threading.Tasks

以下是示例代码::

案例1 ::

            List<string> testTerms = new List<string>();
            testTerms.Add("test1");
            testTerms.Add("test2");

            List<Task> lstTask = new List<Task>();

            foreach (string tTerm in testTerms)
            {
                Task<List<string>> task1 =
                Task<List<string>>.Factory.StartNew(() => SearchString());
                lstTask.Add(task1);
            }

            Task[] searchTasks = (Task[])lstTask.ToArray();
            Task.WaitAll(searchTasks.ToArray(), 1000);


        public List<string> SearchString()
        {
            .....
            Thread.Sleep(20000);
            return list;
        }

现在,它应该等待1000毫秒才能完成所有任务。 但我在Thread.Sleep(20000);中提供了SearchString() 所以会发生什么,即使我提供了Task.WaitAll(searchTasks.ToArray(), 1000);,它也会在这里等待20秒 [这不是预期的]

现在考虑另一种情况。

案例2

Task[] tasks = new Task[0]
         {
          Task.Factory.StartNew(() => SearchString())                                
          };

                     Task.WaitAll(tasks,1000);

现在在这种情况下,即使我在Thread.Sleep(20000);中提供SearchString(),它也只会等待1000毫秒。 [这是预期的]

所以案例2 工作正常,但案例1

那么案例1 的问题是什么?

1 个答案:

答案 0 :(得分:2)

我无法重现您的问题。我认为你错误地等待取消了。

我的代码:

static void Main(string[] args)
{
    List<string> testTerms = new List<string>();
    testTerms.Add("test1");
    testTerms.Add("test2");

    List<Task> lstTask = new List<Task>();

    foreach (string tTerm in testTerms)
    {
        Task<List<string>> task1 =
        Task<List<string>>.Factory.StartNew(() => SearchString());
        lstTask.Add(task1);
    }

    Task[] searchTasks = (Task[])lstTask.ToArray();
    Console.WriteLine(DateTime.Now.ToString() + ": Waiting");
    Task.WaitAll(searchTasks.ToArray(), 1000);
    Console.WriteLine(DateTime.Now.ToString() + ": Done Waiting");
    Console.ReadKey();
}

public static List<string> SearchString()
{
    Thread.Sleep(20000);
    return new List<string>();
}

输出:

6/7/2013 10:05:05 AM: Waiting
6/7/2013 10:05:06 AM: Done Waiting

任务线程将继续执行,但调用/控制线程不会等待,使其完成的时间超过指定的时间。它不会取消线程,但在此之后,只需继续执行。