我有一种方法,基本上将文件从远程系统复制到本地系统。此方法需要在一小时内执行4次,每15分钟执行一次。以周期作为参数调用该方法,其中周期范围为0-3 (0 = Min:0-15;3= Min:45-0)。
我如何将这些线程作为单独的线程运行,然后在下一个小时之前停止所有线程:20来了,这样我就可以调用外部程序ProcessFiles.EXE了?我总是可以继续线程处理,但是我不知道读取文件的程序有多安全。所以我更喜欢在下一个之前剪掉所有的线:20来了。
在此之前,15分钟的窗口足以复制掉在这个15分钟窗口中的所有文件。不幸的是,这一进程变得非常缓慢。因此,假设我正在运行第一个IF语句(at :20),而不是在到达35分钟时停止它,我可以让它在线程中运行到小时结束。但是如果它在下一个:20之后还没有完成,那么线程就需要停止。
编辑:这以前在任务计划程序中。任务将在各自15分钟的时间范围内复制这20个文件。不幸的是,文件复制变得非常缓慢。所以,现在,在某些块中,文件复制所花费的时间要超过15分钟。
所以我最初的想法是把这些过程串联起来。在第一个15分钟块(运行在 Min.00到Min.1的文件的中的IF语句)中,假设我使用了一个线程。这意味着,即使在Min.35(复制Min.15-Min.30的过程开始)之前还没有完成,它仍然有下一次迭代的 means 20 (循环的第一个if语句)。
Scheduler的缺点是,如果任务不能按时完成,它将阻止Scheduler再次运行任务,或者2)如果我强迫它关闭,只复制要复制的任务的一部分。
下面是我的一些代码,您可以了解我正在使用的是什么:
public static void Main(string[] args)
{
DateTime DateNow = new DateTime(2014, 3, 1, 5, 0, 0); //For the example, start at 5AM.
Thread thread0 ;
Thread thread1 ;
Thread thread2 ;
Thread thread3 ;
for (; ; ) //infinite loop
{
//DateNow will usually be DateTime.Now.
if (DateNow.Minute == 20)
{
//Copy files from 5:00-5:15.
//IF any of the threads from Hour 4 are still running, they must be stopped
_CurrentHour = DateNow.Hour;
thread0 = new Thread(() => CopyFiles(_CurrentHour, 0));
thread0.Start();
}
else if (DateNow.Minute == 35)
{
//Copy files from 5:15-5:30.
thread1 = new Thread(() => CopyFiles(_CurrentHour, 1));
thread1.Start();
}
else if (DateNow.Minute == 50)
{
//Copy files from 5:30-5:45.
thread2 = new Thread(() => CopyFiles(_CurrentHour, 2));
thread2.Start();
}
else if (DateNow.Minute == 5)
{
//Copy files from 5:45-6:00.
thread3 = new Thread(() => CopyFiles(_CurrentHour, 3));
thread3.Start();
}
thread0.Join();
thread1.Join();
thread2.Join();
thread3.Join();
//CALL ProcessFiles.EXE
}
}
发布于 2014-05-07 19:34:18
您可以考虑使用任务和取消令牌。
http://msdn.microsoft.com/en-us/library/dd537607(v=vs.110).aspx
通过这种方式,您可以取消这些任务,然后轮询这些任务,直到它们完成/取消,然后再进入下一个步骤。
发布于 2014-05-07 19:29:26
你好像在找两样东西。
为了解决其他问题,关于在15分钟窗口内停止工作线程,最好的选择是让这成为辅助线程的责任。当触发计时器时,您应该记录文件操作的开始时间,并且在工作线程中定期检查所用时间是否小于所需的长度(15分钟)。如果线程检测到它正在接近极限,那么它应该优雅地停止它的处理,并且可能会通知您的应用程序或系统的其他部分它没有完成。
发布于 2014-05-07 19:29:04
在第一个线程中,等待15分钟,然后复制文件:
System.Threading.Thread.Sleep(1000 * 60 * 15); // 15 mins
如果要终止线程,可以调用Abort函数:
thread1.Abort();
https://stackoverflow.com/questions/23526516
复制相似问题