Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速C#线程类_C#_Multithreading - Fatal编程技术网

快速C#线程类

快速C#线程类,c#,multithreading,C#,Multithreading,有一个关于创建C#线程的快速问题 它需要每10分钟运行一次 工人将完成工作,然后再进入睡眠10分钟 也可以通过调用Trigger()触发它立即运行 它可以通过调用Stop()来停止 我用ManualResetEvent创建了一个,它是在调用Stop()时设置的。这很好,但我是否需要创建另一个ManualResetEvent或wait句柄才能立即触发辅助线程?是的,您需要另一个等待句柄来强制线程执行。对于这个句柄,您基本上必须WaitOne等待10分钟,因此要么超时,要么在等待句柄发出信号时继

有一个关于创建C#线程的快速问题

  • 它需要每10分钟运行一次
  • 工人将完成工作,然后再进入睡眠10分钟
  • 也可以通过调用Trigger()触发它立即运行
  • 它可以通过调用Stop()来停止

我用ManualResetEvent创建了一个,它是在调用Stop()时设置的。这很好,但我是否需要创建另一个ManualResetEvent或wait句柄才能立即触发辅助线程?

是的,您需要另一个等待句柄来强制线程执行。对于这个句柄,您基本上必须
WaitOne
等待10分钟,因此要么超时,要么在等待句柄发出信号时继续


不过,别忘了将该句柄切换到无信号状态。

如果停止的意思是停止等待,不再运行,那么我认为线程计时器将是一个很好的(精简)选择


您可以使用DoWork()方法和10分钟的间隔来激活计时器。它将使用线程池,这似乎是这里的最佳选择。Trigger()可以直接在池上对DoWork进行排队,Stop()可以停用计时器。DoWork()不应该使用Sleep(),并且适合线程池。

在这里使用计时器是有意义的。这里有一个我还没有测试过的快速代码片段

    private System.Timers.Timer _timer = null;

    public void Constructor()
    {
        _timer = new System.Timers.Timer(600000);
        _timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
    }

    public void ForceDoWork()
    {
        //unsubscribe to timer event, so work dowsnt get fired twice
        _timer.Elapsed -= new ElapsedEventHandler(t_Elapsed);

        StartWorking();

        _timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
    }

    public void StartWorking()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(WorkToBeDone));
    }

    private void WorkToBeDone(object state)
    {
        //work here
    }

    public void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        StartWorking();
    }

还要看一下+1:这可能是一个很好的方法,只要您正在做适合线程池线程的工作。请记住,线程池线程不是为长时间运行的活动而设计的。你不会让线程池线程休眠,你只需在手动触发器()上适当地手动操作计时器,每十分钟触发一次操作。你使用的是单独创建的线程,这不如线程池效率高。@Henk说得对,我没听清楚。看看这篇关于Thread vs ThreadPool的文章:@Paco基本上是这样的,因为Threading.Timer不支持注册和注销侦听器。还有线程。据我所知,计时器不是线程安全的(!)。参考:&