Если вы вызываете 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 () не будет блокироваться, потому что он будет выполняться асинхронно и совсем не выглядит страшно!