【问题标题】:Tasks or ThreadPool to handle http requests?任务或线程池来处理 http 请求?
【发布时间】:2015-03-27 15:48:00
【问题描述】:

我最近升级了我一直从事的个人项目以使用 .Net 框架 4.5。在更新我的应用程序并利用新的 Async 和 Await 功能时,我还考虑改进我的自定义内部 Http 服务器,该服务器使用 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
}

【问题讨论】:

  • Task 只是一个允许异步操作的工具,例如请求运行线程池线程中的方法,以不同方式执行。它旨在更易于使用。您是否真的喜欢它是需要做出的决定。如果更喜欢它,那就使用它。如果你不这样做,那就不要。
  • 请注意,如果您已经在使用 ASP.NET 等框架,它将代表您处理请求并管理线程基础结构。
  • 它是一个winform桌面应用程序

标签: c# task threadpool


【解决方案1】:

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

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

【讨论】:

  • 你能举个例子吗?我以为 EndGetContext 是异步操作?
  • 是的,这是异步的。不确定你在说什么。 HandleRequest 没有使用异步 IO,至少看起来不像。
  • 哦好的,我明白你的意思了,谢谢:)
猜你喜欢
  • 2012-02-12
  • 2013-02-08
  • 2018-07-19
  • 2014-11-16
  • 2022-07-20
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
相关资源
最近更新 更多