【发布时间】:2017-08-28 12:38:41
【问题描述】:
我在控制台应用程序的主要方法中使用了 Timer。现在我使用一些while循环来保持我的主线程活着,这是我在网上找到的。因为当它死亡时,我的线程,我传递给计时器的执行方法也会死亡。
问题:它阻塞了我的主线程还是可以这样使用?或者有没有更好的方法来保持主线程活着而不阻塞任何东西?
public void Run()
{
Logger.Trace("Timer Started.");
Timer.Change(0, Timeout.Infinite);
Console.WriteLine("Press ESC to stop...");
while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape))
{ }
}
【问题讨论】:
-
您可以使用 Dispatcher TImer,它将在后台执行一些其他工作,并在需要时(例如每 1 秒)调用到您的主线程:wpf-tutorial.com/misc/dispatchertimer
-
@sTrenat 它将是控制台或 Windows 服务应用程序,而 Threading.Timer 已经完成了我需要的所有工作。我只是想知道一种线程安全的方法来保持我的主线程处于活动状态而不阻塞它。
-
“这样用可以吗”——没关系。在控制台应用程序末尾使用
Console.ReadKey是防止其完成的常用方法。 -
.. 但是,您正在检查(为什么?)
KeyAvailable,这使得循环非常占用 CPU。删除该检查。 -
@Sinatr 我正在使用 KeyAvailable 根据stackoverflow.com/a/24424239/5506726
标签: c# multithreading timer