Tar*_*mar 6 .net c# console-application
我正在编写控制台应用程序,它通过调度程序执行一些工作并将输出写入控制台.一切都很好但是当我点击控制台时它停止工作并等待我的右键单击.之后它继续工作.
我认为它根本不会将文本写入控制台并执行它需要做的事情,但不是,它等待我的交互.我可以将此代码重写为WinForms或WPF,但我认为它可以用另一种方式解决.在这里我的代码
static void Main(string[] args)
{
Console.WriteLine("Started...");
var timer = new System.Timers.Timer(1000);
timer.Elapsed += timer_Elapsed;
timer.Start();
Console.ReadLine();
}
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Writing to file " + DateTime.Now.ToString());
System.IO.File.AppendAllLines(@"C:\Temp\log.txt",
new[] { DateTime.Now.ToString()});
}
Run Code Online (Sandbox Code Playgroud)
单击控制台后,它会停止将时间附加到文件log.txt.任何想法如何解决?谢谢.
这是标准的控制台行为,它等待用户输入锁定执行线程.要理解为什么要看Console.Write实现.它只是写入Console输出(Console.Out属性),默认情况下是同步TextWriter(源).所以,"神奇"就在这里.
您可以通过将控制台写入委托给专用线程来解决此问题.比如他的方式:
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("Writing to file " + DateTime.Now.ToString());
});
System.IO.File.AppendAllLines(@"C:\Temp\log.txt",
new[] { DateTime.Now.ToString()});
}
Run Code Online (Sandbox Code Playgroud)
因此,您的应用程序将继续写入文件,但只有在您右键单击时才会将文本写入控制台.这个实现的问题是它可以创建很多增加ThreadPool的线程.
例如,使用一些特殊的TaskScheduler(如SequentialScheduler)可以实现更好的实现
static TaskFactory factory = new TaskFactory(new SequentialScheduler());
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
factory.StartNew(() =>
{
Console.WriteLine("Writing to file " + DateTime.Now.ToString());
});
System.IO.File.AppendAllLines(@"C:\Temp\log.txt",
new[] { DateTime.Now.ToString()});
}
Run Code Online (Sandbox Code Playgroud)
它不会增加ThreadPool.也可以使用另一种实现,但主要思想是 - 将控制台写入委托给另一个可能被用户阻止的线程,工作线程将被解除阻塞并继续工作.
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |