-4

我正在使用 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() 所以发生的情况是,即使我提供了它也会在这里等待 20 秒Task.WaitAll(searchTasks.ToArray(), 1000); [这不是预期的]

现在考虑另一种情况。

案例2

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

                     Task.WaitAll(tasks,1000);

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

所以Case 2工作正常,但Case 1

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

4

1 回答 1

2

我无法重现您的问题。我认为您误认为等待 CancellationToken。

我的代码:

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

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

于 2013-06-07T14:06:27.173 回答