【发布时间】:2015-10-20 01:46:02
【问题描述】:
我正在重新运行 Task 完成后。下面是我在应用程序的Application_Start 中调用的函数。
private void Run()
{
Task t = new Task(() => new XyzServices().ProcessXyz());
t.Start();
t.ContinueWith((x) =>
{
Thread.Sleep(ConfigReader.CronReRunTimeInSeconds);
Run();
});
}
我想运行多个任务,编号将从 web.config 应用设置中读取。
我正在尝试这样的事情,
private void Run()
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < ConfigReader.ThreadCount - 1; i++)
{
tasks.Add(Task.Run(() => new XyzServices().ProcessXyz()));
}
Task.WhenAll(tasks);
Run();
}
这样做的正确方法是什么?
【问题讨论】:
-
如果您不想深入构建自己的 taskrunner/扩展该类,我可能会使用
tasks.First().Wait();等待第一个任务结束,然后使用带有线程的 while 循环.Sleep 观察剩余任务的状态。 -
您想在预定的时间间隔内重复运行一段代码吗?听起来确实是
Timer存在的确切原因。当然,如果你想坚持这一点,只需将你的 continuation 绑定到Task.WhenAll的结果,一切都会像以前一样工作。 -
您需要
await Task.WhenAll(tasks);或Task.WaitAll(tasks);。一个是异步调用,应该等待,另一个是可以在同步上下文中调用的普通函数。当然你也可以去丑的Task.WhenAll(tasks).Wait();