如何在不影响服务器性能的情况下从TCP服务器进行数据库插入操作

时间:2015-09-07 08:25:45

标签: c# asynchronous .net-4.5 tcpserver

我在.net 4.5中设计了异步tcp服务器。使用此Link使用异步等待模式,目前多个客户端同时连接到服务器并发送一些字符串数据。

目前我将所有收到的数据显示在控制台上仅用于测试目的

我的服务器代码如下

public class AsyncEchoServer
{
    private int _listeningPort;
    public AsyncEchoServer( int port)
    {
        _listeningPort = port;
    }

    public async void Start()
    {

        IPAddress ipAddre = IPAddress.Parse("192.168.2.4");
        TcpListener listener = new TcpListener(ipAddre, _listeningPort);
        listener.Start();
        LogMessage("Server is running");
        while (true)
        {
            try
            {
                var tcpClient = await listener.AcceptTcpClientAsync();
                 HandleConnectionAsync(tcpClient);
            }
            catch (Exception exp)
            {
                LogMessage(exp.ToString());
            }

        }

    }

    private async void HandleConnectionAsync(TcpClient tcpClient)
    {
        string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
        try
        {

            using (var networkStream = tcpClient.GetStream())
            using (var reader = new StreamReader(networkStream))
            using (var writer = new StreamWriter(networkStream))
            {
                writer.AutoFlush = true;
                while (true)
                {
                    var dataFromServer = await reader.ReadLineAsync();
                    if (string.IsNullOrEmpty(dataFromServer))
                    {
                        break;
                    }

                    LogMessage(dataFromServer );
                    await writer.WriteLineAsync("FromServer-" + dataFromServer);
                }
            }
        }
        catch (Exception exp)
        {
            LogMessage(exp.Message);
        }
        finally
        {
           tcpClient.Close();
        }

    }
    private void LogMessage(string message, [CallerMemberName]string callername = "")
    {
        System.Diagnostics.Debug.WriteLine("[{0}] - Thread-{1}- {2}", callername, Thread.CurrentThread.ManagedThreadId, message);
    }

现在我想以这样的方式设计它,即从客户端接收的数据应该插入到适当的数据库表中。

但我担心这会降低我服务器的性能,因为数据库操作非常笨重。任何人都可以建议我应该采用什么方法处理从多个客户端收到的数据。

我正在考虑使用datatable将所有传入的数据插入其中,并使用bulkinsert将其插入sql server中

但我不确定如何维护每个连接的数据表,甚至不知道它的好主意

我只是不知道从哪里开始,任何有价值的投入都会非常有用

提前致谢。

2 个答案:

答案 0 :(得分:2)

您已拥有异步TCP服务器。显而易见的解决方案是使数据库访问异步 - 然后数据库本身是您的限制,而不是您的服务器代码。除非你为5万个并发用户进行聊天,否则你真的很好;否则,你需要更多的知识,而不仅仅是来自SO的简单提示:)

答案 1 :(得分:0)

我认为你不应该使用async-await来完成这项任务。 您应该为每个客户端连接启动新的线程

 // Get new client
 TcpClient Client = Listener.AcceptTcpClient();
 // Create Thread
 Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
 // Start Thread for this client
 Thread.Start(Client);

正如您所看到的,创建的Thread中的async-await没有任何意义。