我的问题是控制台应该保持打开状态。当Console.ReadLine()等待输入时,计时器无法向控制台写入任何内容。如何在不使用Console.ReadLine(),Console.ReadKey()或system(“pause”)的情况下阻止控制台关闭?
这是我的代码:
namespace Closer {
public static class Program {
public static void Main () {
// Define timer
var t = new Windows.Forms.Timer() {
Enabled = true,
Interval = 30000
};
// Give timer the tick function
t.Tick += (object tSender, EventArgs tE) => {
// If it is half past eleven
if (DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() == "2330") {
// Close all osu!.exe's --- works
foreach (Process p in Process.GetProcessesByName("osu!")) {
p.Kill();
}
// Write a msg
Console.WriteLine("Done!");
}
};
// Prevent the console from closing --- Here's the problem
Console.ReadLine();
}
}
}
答案 0 :(得分:3)
您正在混淆两个问题。是的,.NET 4.5的早期版本错误地让Console.ReadLine()采取阻止线程写入控制台的锁定。这已得到修复,只需打开Windows Update即可获得服务版本。
但真正的问题是你的Timer类选择。 System.Windows.Forms.Timer需要一个消息循环来触发Tick事件。您只能通过调用Application.Run()来获取消息循环。对于Console.ReadLine()顺便说一下非常合适的替代品,使用Application.ExitThread()来终止您的应用。
您应该在控制台模式应用程序中使用System.Threading.Timer或System.Timers.Timer。它们的回调是在线程池线程上触发的,因此不需要调度程序循环。
答案 1 :(得分:2)
你应该使用System.Timers.Timer
,一切正常。
static void Main()
{
// Define timer
System.Timers.Timer t = new System.Timers.Timer()
{
Enabled = true,
Interval = 1000
};
// Give timer the tick function
t.Elapsed += (object tSender, System.Timers.ElapsedEventArgs tE) =>
{
Console.WriteLine("Done!");
};
Console.ReadLine();
}
答案 2 :(得分:-2)
你可以试试这个:
Thread.CurrentThread.Join();
我知道这很愚蠢,但这可以满足您的需求。并且该过程永远不会终止(本身)你要手动杀死。