2015-02-05 2 views
1

Я подключаюсь к учетной записи Gmail, используя TCP-клиент для чтения электронных писем. Он возвращает SslStream для TCP-соединения. Он отлично работает для среды с одним потоком, но производительность очень низкая с точки зрения скорости.TCP-клиент через многопоточность в C#

Мне нужно оптимизировать проект, чтобы его скорость могла быть увеличена. Я реализовал многопоточность, которая увеличивает количество исправлений, но приложение в какой-то момент зависает.

Можно ли использовать поточное соединение TCP (глобальный член)?

ИЛИ Могу ли я создать несколько соединений TCP и передать метод потока для увеличения скорости?

ИЛИ есть ли другой лучший способ для этого?

TCPClient m_TCPclient 
SslStream sslStream; 

private void createTCP() 
{ 
// creating tcp and sslstream 
} 

private void authenticateUser() 
{ 
// authenticating the user 
} 

private void getUserdata() 
{ 

// iterating folders and its items 
foreach(string emailID in IDList) 
{ 
//Thread implementation 

} 

ответ

0

Что касается ниточного, взять быстрый взгляд на документацию по TcpClient и SslStream:

Любого публичные статический (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.

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

0

Ни объекты TCPClient, ни SslStream не являются потокобезопасными. Вам нужно будет добавить синхронизацию потоков, чтобы избежать условий гонки, чтобы избежать зависания. Однако скорость вашего приложения по-прежнему будет зависеть от единственного клиента tcp, который по существу делает вашу многопоточную нить бесполезной с точки зрения пропускной способности tcp.

Создайте для каждого потока свои собственные соединения и объекты потока. Это, в свою очередь, увеличит пропускную способность tcp, что, скорее всего, станет узким местом вашего приложения.

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

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

Смежные вопросы