C#任务,或多个侦听器的线程
我正在尝试将用Python/Tornado编写的游戏服务器移植到C。我需要2个TCP异步侦听器(具有多个客户端)和主游戏循环。处理这个问题的好方法是什么 我现在找到了两种方法:C#任务,或多个侦听器的线程,c#,multithreading,asynchronous,mono,tornado,C#,Multithreading,Asynchronous,Mono,Tornado,我正在尝试将用Python/Tornado编写的游戏服务器移植到C。我需要2个TCP异步侦听器(具有多个客户端)和主游戏循环。处理这个问题的好方法是什么 我现在找到了两种方法: var gameListenerTask = Task.Run(() => { //Run listener and wait }); var lobbyListenerTask = Task.Run(() => { // Run other listener. }); Task.Wait
var gameListenerTask = Task.Run(() => {
//Run listener and wait
});
var lobbyListenerTask = Task.Run(() => {
// Run other listener.
});
Task.WaitAll(gameListenerTask, lobbyListenerTask);
或:
还有第二个问题。如果我阅读,我正在使用:
handler.BeginReceive(client.Buffer, 0, Settings.ClientBufferSize,
SocketFlags.None, new AsyncCallback(client.ReadData), client);
读取的字节总是放在缓冲区的开头?要回答您的问题,您需要知道任务和线程之间的区别 在问题中,“Mitch Wheat”回答了以下问题: 任务是你想要完成的事情 线程是执行该任务的许多可能工作线程之一 在.NET4.0术语中,任务表示异步操作。线程用于通过将工作分解成块并分配给单独的线程来完成该操作 根据这个答案,你应该使用任务,如“Sreemat”所说。任务预定使用“异步”操作 你的小问题:
根据“BeginReceive”方法的原理,我认为您是对的。对于这个老问题,请使用第一种可能重复的建议:您可以使用Task.Factory.StartNew,我认为它是,指定您的任务是“长时间运行的”,因此可以相应地处理它。一个永远不会结束的任务肯定是长时间运行的,我相信这会告诉池过度提供线程是合适的。
handler.BeginReceive(client.Buffer, 0, Settings.ClientBufferSize,
SocketFlags.None, new AsyncCallback(client.ReadData), client);