2015-09-07 6 views
-1

Я разработал async tcp server в .net 4.5. с шаблоном ожидания async с использованием этого Link, в настоящее время несколько клиентов одновременно подключаются к серверу и отправляют некоторые строковые данные.Как сделать операцию вставки базы данных с сервера TCP без влияния на производительность сервера

В настоящее время я отображая все полученные данные в консоль только для целей тестирования

Мой код сервера, как показано ниже

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 сервере

, но я не уверен, как сохранить DataTable для каждого соединения или даже его хорошая идея или нет

Я просто не знаю, откуда я полагаю, чтобы начать, любой ценный вклад будет очень полезно

Спасибо заранее.

ответ

2

У вас уже есть асинхронный TCP-сервер. Очевидным решением является также сделать доступ к базе данных асинхронным - тогда сама БД является вашим пределом, а не кодом сервера. И если вы не делаете чат для одновременных пользователей 50k, вы в порядке, действительно; в противном случае вам понадобится гораздо больше знаний, чем просто простой совет от SO :)

+0

Звучит здорово, позвольте мне взглянуть на это. –

+0

[ссылка] (http://stackoverflow.com/questions/32450432/async-tcp-server-in-net-4-5-using-asyn-and-await-data-loss-is-happening), Можете ли вы перейдите по этой ссылке и предложите мне что-нибудь. –

+0

Я пытаюсь сделать базу данных доступной асинхронной, но пока не удалось :(, Можете ли вы предоставить фрагмент кода, ссылающийся на мой отредактированный код выше. Я попытался создать datatable и вставить все входящие данные в это письмо, чтобы сделать крупноформатную фотографию, но это –

0

Вы не должны использовать async-wait для этой задачи, я думаю. Вы должны начать новую тему для каждого соединения клиента

// 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.

+0

Это * точно * сценарий использования async-ожидания. art новый поток, когда у вас нет работы с ЦП? – Luaan

+0

@ Luaan IMO async-await больше предназначен для использования с пользовательским интерфейсом, для сохранения контекстов и выполнения операций ввода-вывода без блокировки пользовательского интерфейса. По крайней мере, мой опыт работы с асинхронным ожиданием и TcpServer был не таким уж большим. У вас есть достойный пример TCPServer на основе асинхронного ожидания? Изучит его с удовольствием. – xakz

+1

async/await отлично подходят для любых операций асинхронного ввода-вывода. Пользовательский интерфейс уверен, что один из них, но сетевые системы, файловая система и т. Д. - другие отличные примеры. Это экономит ресурсы и снижает сложность кода в этих случаях. –