首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这种情况下使用线程?

在这种情况下使用线程?
EN

Stack Overflow用户
提问于 2014-05-07 19:22:45
回答 3查看 102关注 0票数 0

我有一种方法,基本上将文件从远程系统复制到本地系统。此方法需要在一小时内执行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)如果我强迫它关闭,只复制要复制的任务的一部分。

下面是我的一些代码,您可以了解我正在使用的是什么:

代码语言:javascript
运行
复制
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

    }       
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-07 19:34:18

您可以考虑使用任务和取消令牌。

http://msdn.microsoft.com/en-us/library/dd537607(v=vs.110).aspx

通过这种方式,您可以取消这些任务,然后轮询这些任务,直到它们完成/取消,然后再进入下一个步骤。

票数 1
EN

Stack Overflow用户

发布于 2014-05-07 19:29:26

你好像在找两样东西。

  1. 定期计时器。这些都是.NET in 多种口味。您将安排您的计时器每15分钟执行一次,并根据每15分钟执行一次或每小时一次,决定要复制哪些文件。
  2. 将工作单元排队以在工作线程上执行。这里也有多个选项,从使用托管线程池(直接通过ThreadPool API )或通过任务API (更容易),或者滚动自己的(类似于您试图做的更复杂,但更适合长期运行的任务)。

为了解决其他问题,关于在15分钟窗口内停止工作线程,最好的选择是让这成为辅助线程的责任。当触发计时器时,您应该记录文件操作的开始时间,并且在工作线程中定期检查所用时间是否小于所需的长度(15分钟)。如果线程检测到它正在接近极限,那么它应该优雅地停止它的处理,并且可能会通知您的应用程序或系统的其他部分它没有完成。

票数 2
EN

Stack Overflow用户

发布于 2014-05-07 19:29:04

在第一个线程中,等待15分钟,然后复制文件:

代码语言:javascript
运行
复制
System.Threading.Thread.Sleep(1000 * 60 * 15); // 15 mins

如果要终止线程,可以调用Abort函数:

代码语言:javascript
运行
复制
thread1.Abort();
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23526516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档