【发布时间】:2021-04-09 09:31:57
【问题描述】:
我必须申请2个方法:
- 使用不同的线程/任务处理每个 HTTP 请求。
- 在调用取消令牌时优雅地完成请求。
现在,我遇到了一个问题,即当调用取消令牌并且请求未到达时 - 我堆叠在“server.getContext”阻塞区域中。 知道如何解决吗?
public void Listen()
{
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
server.Start();
Console.WriteLine($"Waiting for connections on {url}");
HandleShutdownWhenKeyPressed(source);
HandleIncomingHTTPRequests(token);
server.Close();
}
void HandleIncomingHTTPRequests(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
HttpListenerContext ctx = server.GetContext();
// I stack here until the request has arrived even if the cancellation token has invoked.
Task.Run(() =>
{
HttpListenerRequest req = ctx.Request;
HttpListenerResponse res = ctx.Response;
// SOME STUFF ....
},token)
}
}
提前致谢。
【问题讨论】:
-
"用不同的线程/任务处理每个 HTTP 请求。" - 这实际上是两种不同的方法:使用
Task意味着 不 使用不同的线程,因为您将使用异步 IO 和线程池。 -
你的
HandleIncomingHTTPRequests方法应该被标记为async Task不是void- 你不需要使用Task.Run。 -
嗨@Dai,为什么不呢?如果我想用不同的任务(比如线程池中的不同线程)执行请求 - 否则我该如何实现?
-
使用
HttpListener.GetContextAsync- 它为你处理异步IO。 -
@Dai - 据我所知 - 与线程池不同的线程!= 异步 IO 操作。我在写吗?
标签: c# multithreading httplistener