我最近升级了一个我正在努力使用.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
}
答案 0 :(得分:2)
答案是肯定的,但仅仅因为Task更现代化。线程池与Task
之间没有根本区别(假设您的意思是基于CPU的任务)。
更重要的优化是使HandleRequest
异步。您对GetContext
使用异步IO不会为可伸缩性增加一点。请求处理必须是异步的,而不是接受。