2013-09-08 5 views
0

Я создал веб-службу с HttpListener. Для некоторых запросов ему нужны длительные рабочие задания, которые могут занимать около 10 минут. Так что я следующий и вернуться с сервера:Работы HTTPListener и LongRunning

var task = Task.Factory.StartNew(() => ImportDocuments(), TaskCreationOptions.LongRunning); 
CreateResponse(context.Response, "started"); 

Это гарантированно вернуться с сервера и запустить новый поток для выполнения задачи или я должен использовать Process.Start? Я не использовал Process.Start, как я должен, чем реализовать отдельное приложение, чем приложение Windows.

ответ

1

Вам определенно не нужно использовать Process.Start.

Я еще не нашел гарантии, что использование TaskCreationOptions.LongRunning всегда запускает задачи по новой теме независимо от ThreadPool, но импликация такова. best I can find в том, что он:

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

Но продолжает утверждать, что:

Используя эту опцию, вы избегаете ThreadPool полностью, включая глобальные и локальные очереди.

Подсказка или гарантия? Я уверен, что это гарантировано, но это только мнение и ИМО, документы не категорически поддерживают это.

Небольшое количество работы с декомпилятором скажет вам правду.

Если вы все еще не удовлетворены, то:

new Thread(() => { 
    //my long running code 
}).Start(); 

будет абсолютно гарантировать, что долго работает работа не голодать ваше ThreadPool. Просто убедитесь, что вы не убиваете свой процессор миллиардом потоков.

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