如何让我的控制台应用程序在另一个线程上运行后台进程而不退出?
Posted
技术标签:
【中文标题】如何让我的控制台应用程序在另一个线程上运行后台进程而不退出?【英文标题】:How do I get my console application to run a background process on another thread without exiting? 【发布时间】:2012-12-12 12:16:08 【问题描述】:我知道.NET 中有三种计时器类型(请参阅Comparing the Timer Classes in the .NET Framework Class Library)。我选择了一个线程定时器,因为如果主线程很忙,其他类型的定时器可能会漂移,我需要它是可靠的。
这个计时器在计时器控制下的工作方式被放在另一个线程上,因此它总是可以在不忙时随着父线程上的工作开始完成。
这个计时器在控制台应用程序中的问题是,当计时器在另一个线程上计时,主线程没有做任何事情,所以应用程序关闭。
我尝试添加一个while true
循环,但是当计时器停止时主线程太忙了。
【问题讨论】:
您可以通过在循环内添加Thread.Sleep(100)
来放弃while true
循环所消耗的时钟周期。不过,可能有更好的方法来完成这一切,比如创建 Windows 服务。
【参考方案1】:
我会使用一个等待所有线程完成的屏障。由于有一个主线程和一个计数线程,我有 2 个参与者。所以它看起来像这样:
Module Module1
Dim x As New Threading.Thread(AddressOf tick)
Dim y As New Threading.Barrier(2)
Sub Main()
x.IsBackground = True
x.Start()
y.SignalAndWait()
End Sub
Sub tick()
Threading.Thread.Sleep(10000)
y.SignalAndWait()
End Sub
End Module
【讨论】:
这真的有什么作用吗,或者它只是一个包含Sleep()
调用的无限循环的一大堆仪式? documentation for Threading.Barrier 声明 Barrier 类 “使多个任务能够通过多个阶段并行协作处理算法。” 我没有看到“合作”、“并行”或“多个阶段” " 这里的任何地方。
我实际上认为这是屏障的非常简单和很好的解释用法。主线程和另一个线程协同工作。仅仅因为它很简单并不意味着它不能协同工作。另一点是,屏障采用与您的“循环中的睡眠()”建议相同数量的代码,而它适合更复杂的情况(更多线程或每个毫秒很重要等),根本没有额外的资源成本.因此,对我来说,使用“阻塞”而不是“等待”似乎更合适。以上是关于如何让我的控制台应用程序在另一个线程上运行后台进程而不退出?的主要内容,如果未能解决你的问题,请参考以下文章