我正在使用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 的问题是什么?
答案 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
任务线程将继续执行,但调用/控制线程不会等待,使其完成的时间超过指定的时间。它不会取消线程,但在此之后,只需继续执行。