2014-12-18 4 views
0

Итак, ниже мой код для программы, связанной с сервером, над которой я работаю. В настоящий момент он довольно голый, но я намерен начать разработку, как только смогу сортировать этот материал.Threading With Async?

Сегодня вопрос, связанный с резьбой, относится к полезности нижнего сегмента приведенного ниже кода.

Если единственный цикл, который у меня есть, это цикл в StartListening, а в конструкторе для этого класса я делаю экземпляр Thread (по моему мнению, это то же самое, что создать задачу с TaskCreationOptions.LongRunning, я знаю, что задача лучше, но на самом деле мне не нужны какие-либо функции задачи, мне просто нужен поток за пределами threadpool), и мой поток thread/ui вызывает этот конструктор (который создает поток), тогда есть ли смысл для меня асинхронно запускать StartListening?

К моему пониманию async и ожидание позволяют основному потоку делать свое дело, когда мы ждем в этом цикле. Но так как это работает на собственном потоке, есть ли смысл для меня снова асинхронно?

ConnectionThread = new Thread(StartListening); 
ConnectionThread.Name = "Connection Handle"; 
ConnectionThread.Start(); 

-------------------------- над этим верхний сегмент ----------- --------------

public async void StartListening() 
{ 
    listener = new TcpListener(15111); 
    listener.Start(); 

    try 
    { 

     while (running) 
     { 
      TcpClient tcpclient = await listener.AcceptTcpClientAsync(); 
      Client client = new Client(tcpclient, ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address.ToString()); 
      Task handshakeTask = Task.Factory.StartNew(() => { 
       ClientHandle.AddToClientPool(client); 
       SendRequestInformation(client, 1); 
      }); 
     } 

    } 
    catch (Exception e) 
    { 
     if (MainWindow.debugWindow != null) 
      MainWindow.mainWindowDispacter.BeginInvoke(SendDebugMessage, new Object[] { e.ToString() }); 
     else 
      Console.WriteLine(e.ToString()); 
    } 
} 

И так как я уже здесь, я в данный момент,

Byte[] buffer = new byte[4068]; 
var AmountRead = await stream.ReadAsync(buffer, 0, buffer.Length, cts); 

Для получения сообщений от клиента. Похоже, я получаю слишком много данных, поскольку размер байта слишком велик. Тогда я попытался.

var AmountRead = await stream.ReadAsync(buffer, 0, t.getClientSocket().ReceiveBufferSize, cts); 

и, похоже, не работает. Любые подсказки?

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Несомненно, спасибо! –

+0

@ В самом начале: я ** настоятельно рекомендую использовать SignalR вместо голых сокетов. SignalR намного проще писать правильный код. –

ответ

0

Цитата:

есть точка для меня ASync это больше

Чтобы ответить на ваш вопрос, да, это имеет смысл, особенно если вы хотите процесс на эту тему, чтобы быть неблокирующий поток. Чтобы указать это в своем коде.

while (running) 
{ 
    TcpClient tcpclient = await listener.AcceptTcpClientAsync(); // NOTE 1 Below 
    Client client = new Client(tcpclient, 
     ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address.ToString()); 
    Task handshakeTask = Task.Factory.StartNew(() => // NOTE 2 Below 
    { 
     ClientHandle.AddToClientPool(client); 
     SendRequestInformation(client, 1); 
    }); 
} 

Примечание 1:

нить сделает паузу и ждать, называемый метод, чтобы закончить, и выполнить после завершения

Примечание 2:

Это будет выполнить асинхронно с помощью вызванного метода async. Таким образом, созданный вами поток продолжит цикл после этого кода, потому что он выполняется в другом потоке.

Так что если вы хотите, чтобы ваша нить выполнить быстрее и вам не нужен ответ на асинхронно начал метод из потока, то это имеет смысл.

+0

Хм, хорошо, мне все равно, если, listener.AcceptTcpClientAsync(), блокирует? Это ничего не блокирует, так как у него есть собственный поток. Я знаю, что после этого я должен начать задание, чтобы продолжить цикл while. –

+0

Ну, так как вам нужен результат вызова, вам будет нужно дождаться его завершения. В любом случае, это не касается нити пользовательского интерфейса – DevEstacion