2016-05-11 3 views
1

У меня есть основной класс, который выполняет некоторые операции и другой класс, который взаимодействует с сервером с помощью сокета.Запуск операций класса по отдельному потоку

Создает ли объект класса сокета следующим образом все операции в классе сокетов, выполняемые в отдельном потоке?

await Task.Run(()=>socketObj.initializeSocket()); 

Или есть другой способ запустить класс в отдельной теме?

+2

yes it does .... –

+3

Что вы подразумеваете под * «все операции в классе сокетов» *? Это делает 'initializeSocket' и все, что вызывается внутри этого метода, запускается в отдельном потоке. –

+0

Класс сокета класса @MattBurland имеет такие методы, как Connect(), SendAndReceive() и т. Д. Когда я вызываю эти методы, они будут обрабатываться отдельным потоком? – Illuminati0x5B

ответ

0

В параллельной библиотеке задач (TPL) используется множество эвристик времени выполнения для принятия решений при планировании выполнения асинхронного метода. Нет никакой гарантии, что он будет всегда запускаться в отдельном потоке (который по существу является потоком из пула потоков CLR). После того, как вы использовали ключевое слово ожидания, это означает, что ваш основной поток заблокирован, и он не может выполнять какую-либо полезную работу, кроме как ждать завершения функции initializeSocket, прежде чем продолжить. Специально в случаях, когда инициализация сокета будет занимать действительно очень малое время, тогда TPL может захотеть использовать ваш основной поток приложений, а не планировать его на своих внутренних планировщиках задач. Я имел некоторые аналогичные сомнения несколько месяцев назад, и эта нить может помочь:

Real purpose of providing TaskScheduler option through ParallelOptions parameter in Parallel class APIs

Подробнее здесь:

Is Task.Factory.StartNew() guaranteed to use another thread than the calling thread?

Не беспокойтесь о других TPL APIs обсуждается в этих нитях вместо Task.Run в вашем случае. Задача - это задача, независимо от API, который ее создает. Большинство эвристик планировщика задач останутся такими же, как только вы войдете в мир TPL.

0

Создает ли объект класса сокета следующим образом все операции в классе сокетов, выполняемые в отдельном потоке?

No.

Или есть другой способ, чтобы запустить класс в отдельном потоке?

Я не уверен, что означает «запуск класса».

Код, который у вас есть, будет вызывать initializeSocket в потоке пула потоков. Это не приведет к запуску всех других методов на socketObj для потоков потоков потоков.

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