Должны ли записи в NetworkStream выполняться асинхронно - PullRequest
0 голосов
/ 28 апреля 2011

Учитывая, что NetworkStream.Write() является блокирующим вызовом, должен ли метод, подобный SendMessage(), создать новый поток для выполнения операции записи, или должен SendMessage() метод блокироваться, пока не будет отправлено сообщение или не возникнет исключение?

В моей интуиции сказано, что разумно блокировать этот метод, но, глядя на действительно хороший пример сокетов в C # , я обнаружил, что они создают новый поток.Основная проблема, которую я вижу при создании другого потока, заключается в обработке ошибок.

PS: я знаю об асинхронных версиях записи, чтения и т. Д., Но нахожу IAsyncResult довольно запутанным и в настоящее время воздерживается от использования этих параметров.

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

Если вы вызываете SendMessage() в потоке пользовательского интерфейса, он заблокирует его, и ваше приложение "зависнет". Вместо создания нового потока каждый раз, когда вы хотите отправить данные, используйте ThreadPool.QueueUserItem(o => SendMessage()) или Task.Factory.StartNew(() => SendMessage()) из Task Parallel Library в .NET 4.0

Если ваше приложение обслуживает клиентов и вы создаете новый поток для каждого клиента, тогда SendMessage() может блокироваться, если вы не хотите выполнять другую работу при отправке данных клиенту.

Создание нового потока для каждого клиента имеет один недостаток: большое количество потоков будет потреблять много ресурсов, и большую часть времени эти потоки будут простаивать, пока они могут обслуживать других клиентов. Если вы хотите создать высокопроизводительное серверное приложение, вам следует изучить асинхронное программирование.

Выезд Асинхронный CTP . Это позволит вам писать асинхронный код, который выглядит как синхронный код без грязных обратных вызовов

public async void SendMessage()
{
    try {
        await socket.WriteAsync(buffer, 0, buffer.Length);
    } catch (...) {
        // handle it
   }
}

Теперь SendMessage () не будет блокироваться, потому что он будет выполняться асинхронно и совсем не выглядит страшно!

0 голосов
/ 28 апреля 2011

Я настоятельно рекомендую вам взглянуть на параллельную библиотеку задач .

Вы можете создать задачу из любого асинхронного шаблона в текущем .net.

Задача будетвыполняется в пуле потоков, и исключения будут любезно маршалироваться из других потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...