2015-01-28 9 views
1

Недавно я обновил личный проект, над которым я работал, для использования .Net framework 4.5. При обновлении моего приложения и использовании новых функций Async и Await я подумал о том, чтобы улучшить свой собственный внутренний Http-сервер, который использует ThreadPool для обработки запроса и отправки ответа клиенту. Было бы лучше использовать задачи вместо этого?Задачи или ThreadPool для обработки HTTP-запросов?

Вот мой текущий код:

/// <summary> 
/// Accepts the connection 
/// </summary> 
private static void DoAcceptClientCallback(IAsyncResult Sync) 
{ 
    try 
    { 
     // Finish accepting the client 
     HttpListenerContext Context = Listener.EndGetContext(Sync); 
     ThreadPool.QueueUserWorkItem(HandleRequest, new HttpClient(Context)); 
    } 
    catch (HttpListenerException E) 
    { 
     // Thread abort, or application abort request 
     if (E.ErrorCode == 995) 
      return; 

     ServerLog.Write("ERROR: [DoAcceptClientCallback] \r\n\t - {0}\r\n\t - ErrorCode: {1}", E.Message, E.ErrorCode); 
    } 
    catch (Exception E) 
    { 
     ServerLog.Write("ERROR: [DoAcceptClientCallback] \r\n\t - {0}", E.Message); 
    } 

    // Begin Listening again 
    if(IsRunning) 
     Listener.BeginGetContext(new AsyncCallback(DoAcceptClientCallback), Listener); 
} 

/// <summary> 
/// Handles the Http Connecting client in a new thread 
/// </summary> 
private static void HandleRequest(object Sync) 
{ 
    /// ... Processing Stuff is done here to serve the page back to the client 
} 
+1

'Задача' - это просто инструмент, который позволяет выполнять асинхронную операцию, например запросы на запуск метода в потоке пула потоков, которые выполняются по-разному. Он прост в использовании. Предпочитаете ли вы это или нет, это решение, которое вы * должны сделать. Если * вам * нравится это лучше, используйте его. Если вы этого не сделаете, тогда не делайте этого. – Servy

+1

Обратите внимание, что если вы уже используете фреймворк, такой как ASP.NET, он будет обрабатывать запросы от вашего имени и управлять инфраструктурой потоков. –

+0

Его настольное приложение winform – Wilson212

ответ

2

Ответ да, но только потому, что задача более современный. Нет фундаментальной разницы между threadpool и Task (предполагая, что вы имеете в виду задачи на базе процессора).

Более важная оптимизация заключается в том, чтобы сделать HandleRequest асинхронным. Ваше использование async IO для GetContext не добавляет один бит к масштабируемости. Обработка запроса должна быть асинхронной, а не принимающей.

+0

Можете ли вы привести мне пример? Я думал, что EndGetContext - это операция Async? – Wilson212

+0

Да, это асинхронно. Не уверен, что вы говорите. HandleRequest не использует async IO, по крайней мере, он не похож на него. – usr

+0

О, хорошо, я понимаю, что вы имеете в виду сейчас, спасибо :) – Wilson212

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