C#任务,或多个侦听器的线程

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

我正在尝试将用Python/Tornado编写的游戏服务器移植到C。我需要2个TCP异步侦听器(具有多个客户端)和主游戏循环。处理这个问题的好方法是什么

我现在找到了两种方法:

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);