0

我有这个代码:

public async virtual void Start(IPAddress ip, int port)
    {
        //Start listening proccess
        Listener = new TcpListener(ip, port);
        Listener.Start();
        IsListening = true;
        await Task.Run(async () =>
            {
                while (IsListening)
                {
                    if (Listener.Pending())
                    {
                        TcpClient client = await Listener.AcceptTcpClientAsync();
                        SkyfilterClient sklient = new SkyfilterClient(client);
                        byte command = sklient.Reader.ReadByte();
                        if (command == (byte) SkyfilterCommand.Authenticate)
                        {
                            sklient = await Authenticate(sklient);
                        }
                        else if(command == (byte)SkyfilterCommand.Register)
                        {
                            sklient = await Register(sklient);
                        }
                    }
                }
            });
    }

Program.cs 中的代码,主要方法

new SkyfilterCoreLib.Network.SkyfilterServer().Start(IPAddress.Loopback, 7812);
Console.ReadLine();

如果我有异步 lambda 是最好的吗?或者我只使用一项任务,让听众Listener.AcceptTcpClient只使用?哪一个有最好的表现?谢谢

4

1 回答 1

1

目前尚不清楚您为什么要创建任务。无论如何,您都在等待该任务的完成,所以为什么不直接使用:

Listener = new TcpListener(ip, port);
Listener.Start();
IsListening = true;
while (IsListening)
{
    if (Listener.Pending())
    {
        var client = await Listener.AcceptTcpClientAsync();
        // I assume you want to do something with the client now...
    }
}

在这种情况下,如果你让这个位同步并没有太大的区别——这实际上取决于你是否想要监听异步操作本身的业务。

我认为更大的问题是一旦你接受了客户,你将如何处理它。您可能希望使用另一种异步方法来处理客户端但不等待结果

List<Task> ongoingTasks = new List<Task>();
...
var client = await Listener.AcceptTcpClientAsync();
ongoingTasks.Add(HandleClientAsync(client));

然后,当您想关闭时,您可以等待所有正在进行的任务完成(可能有超时),然后再让进程终止。

于 2013-05-18T15:00:02.640 回答