我正在使用同步apis和线程池的tcp服务器上看起来像这样:
TcpListener listener;
void Serve(){
while(true){
var client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(this.HandleConnection, client);
//Or alternatively new Thread(HandleConnection).Start(client)
}
}
Run Code Online (Sandbox Code Playgroud)
假设我的目标是在资源使用率最低的情况下处理尽可能多的并发连接,这似乎很快就会受到可用线程数量的限制.我怀疑通过使用非阻塞任务apis,我将能够用更少的资源处理更多.
我最初的印象是这样的:
async Task Serve(){
while(true){
var client = await listener.AcceptTcpClientAsync();
HandleConnectionAsync(client); //fire and forget?
}
}
Run Code Online (Sandbox Code Playgroud)
但令我印象深刻的是,这可能会导致瓶颈.也许HandleConnectionAsync需要花费非常长的时间才能达到第一次等待,并且将阻止主接受循环继续进行.这只会使用一个线程,还是运行时会在多个线程上神奇地运行它看起来合适的东西?
有没有办法结合这两种方法,以便我的服务器将使用它所需的线程数量来确定正在运行的任务的数量,但是它不会在IO操作上不必要地阻塞线程?
在这样的情况下,是否存在最大化吞吐量的惯用方法?
我正在尝试学习使用Log4Net来改进我的程序中的日志记录技术。我已经阅读了 Log4Net 网站中提供的文档,但是我有这些问题。
这是Log4Net网站上的示例程序中显示的最简单的输出BasicConfigurator.Configure()。
0 [main] INFO MyApp - Entering application.
36 [main] DEBUG Com.Foo.Bar - Did it again!
51 [main] INFO MyApp - Exiting application.
Run Code Online (Sandbox Code Playgroud)
我的程序已经有一个窗格(在调试模式下)来显示程序的流程,该流程在多次异步尝试中循环。所以当我运行它时,我可以看到程序的流程(典型的批量调试方法)。
在这个级别,据我所知,通过使用 Log4Net,我可以收集那些时刻的日志,这些日志可以附加到许多不同的输出方法中,例如控制台、外部文件、数据库等。这导致代码加倍. 在每个测试点中,一行用于将日志输出到 UI,另一行用于 Log4Net 的日志记录。
是否有任何方法可以将其中一个附加程序的内容(例如上面显示的附加程序)输出到字符串或类似类型的变量,以便能够在运行时显示它?
我不确定如何在 WPF 应用程序中看到控制台的输出。将Log4Net输出到文件中,然后将它的竞赛打印回字符串似乎很有趣。
当Show output from:下拉菜单设置为“Debug”时,Console Appender可以在Visual Studio的输出窗口中看到 的输出。非常感谢@Aron 指出。