任务或ThreadPool来处理http请求?

时间:2015-01-28 16:30:26

标签: c# task threadpool

我最近升级了一个我正在努力使用.Net framework 4.5的个人项目。在更新我的应用程序,并利用新的Async和Await功能时,我还考虑改进我的自定义内部Http Server,它使用ThreadPool处理请求并将响应发送回客户端。改为使用任务会更好吗?

这是我目前的代码:

/// <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 个答案:

答案 0 :(得分:2)

答案是肯定的,但仅仅因为Task更现代化。线程池与Task之间没有根本区别(假设您的意思是基于CPU的任务)。

更重要的优化是使HandleRequest异步。您对GetContext使用异步IO不会为可伸缩性增加一点。请求处理必须是异步的,而不是接受。